Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Korzystanie z usług o określonym zakresie w ramach elementu
Podczas rejestrowania implementacji IHostedService przy użyciu dowolnej z metod rozszerzenia AddHostedService, usługa jest rejestrowana jako singleton. Mogą istnieć scenariusze, w których chcesz polegać na usłudze o określonym zakresie. Aby uzyskać więcej informacji, zobacz Wstrzykiwanie zależności na platformie .NET: okresy istnienia usługi.
W tym poradniku nauczysz się, jak:
- Poprawnie rozwiąż zależności z zakresem w singletonie BackgroundService.
- Delegowanie pracy do usługi o określonym zakresie.
- Zaimplementuj
override
jako BackgroundService.StopAsync(CancellationToken).
Wskazówka
Cały przykładowy kod źródłowy "Pracownicy na platformie .NET" jest dostępny w Samples Browser do pobrania. Aby uzyskać więcej informacji, zobacz Przeglądanie przykładów kodu: Procesy robocze na platformie .NET.
Wymagania wstępne
- Zestaw SDK .NET 8.0 lub nowszy
- Zintegrowane środowisko projektowe (IDE) platformy .NET
- Zachęcam do korzystania z Visual Studio
Tworzenie nowego projektu
Aby utworzyć nowy projekt usługi roboczej za pomocą programu Visual Studio, wybierz plik>Nowy projekt>.... W oknie dialogowym Utwórz nowy projekt wyszukaj frazę "Usługa procesu roboczego" i wybierz pozycję Szablon usługi procesu roboczego. Jeśli wolisz użyć interfejsu wiersza polecenia platformy .NET, otwórz swój ulubiony terminal w katalogu roboczym. Uruchom polecenie dotnet new
i zastąp <Project.Name>
odpowiednią nazwą projektu.
dotnet new worker --name <Project.Name>
Aby uzyskać więcej informacji na temat polecenia projektu nowej usługi roboczej interfejsu .NET CLI, zobacz dotnet new worker.
Wskazówka
Jeśli używasz programu Visual Studio Code, możesz uruchomić polecenia interfejsu wiersza polecenia platformy .NET z poziomu zintegrowanego terminalu. Aby uzyskać więcej informacji, zobacz Visual Studio Code: Integrated Terminal.
Tworzenie usług o określonym zakresie
Aby używać usług o określonym zakresie w ramach BackgroundService
, utwórz zakres za pomocą interfejsu IServiceScopeFactory.CreateScope() API. Domyślnie dla hostowanej usługi nie jest tworzony żaden zakres. Usługa w tle o określonym zakresie działania zawiera logikę zadania w tle.
namespace App.ScopedService;
public interface IScopedProcessingService
{
Task DoWorkAsync(CancellationToken stoppingToken);
}
Powyższy interfejs definiuje jedną DoWorkAsync
metodę. Utwórz implementację w nowej klasie o nazwie DefaultScopedProcessingService.cs:
namespace App.ScopedService;
public sealed class DefaultScopedProcessingService(
ILogger<DefaultScopedProcessingService> logger) : IScopedProcessingService
{
private readonly string _instanceId = Guid.NewGuid().ToString();
public Task DoWorkAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
"{ServiceName} doing work, instance ID: {Id}",
nameof(DefaultScopedProcessingService),
_instanceId);
return Task.CompletedTask;
}
}
- Element ILogger jest wstrzykiwany do usługi przy użyciu konstruktora podstawowego.
- Metoda
DoWorkAsync
zwraca elementTask
i akceptuje element CancellationToken.- Metoda rejestruje identyfikator wystąpienia —
_instanceId
jest przypisywany za każdym razem, gdy wystąpi wystąpienie klasy.
- Metoda rejestruje identyfikator wystąpienia —
Przepisz klasę Worker
Zastąp istniejącą Worker
klasę następującym kodem c# i zmień nazwę pliku na ScopedBackgroundService.cs:
namespace App.ScopedService;
public sealed class ScopedBackgroundService(
IServiceScopeFactory serviceScopeFactory,
ILogger<ScopedBackgroundService> logger) : BackgroundService
{
private const string ClassName = nameof(ScopedBackgroundService);
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
"{Name} is running.", ClassName);
while (!stoppingToken.IsCancellationRequested)
{
using IServiceScope scope = serviceScopeFactory.CreateScope();
IScopedProcessingService scopedProcessingService =
scope.ServiceProvider.GetRequiredService<IScopedProcessingService>();
await scopedProcessingService.DoWorkAsync(stoppingToken);
await Task.Delay(10_000, stoppingToken);
}
}
public override async Task StopAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
"{Name} is stopping.", ClassName);
await base.StopAsync(stoppingToken);
}
}
W poprzednim kodzie, chociaż stoppingToken
nie został anulowany, IServiceScopeFactory
jest używany do tworzenia zakresu. Z IServiceScope
, IScopedProcessingService
jest rozwiązywane. Oczekuje się wykonania metody DoWorkAsync
, a stoppingToken
jest przekazywane do metody. Na koniec wykonanie jest opóźnione przez 10 sekund, a pętla będzie kontynuowana. Za każdym razem, gdy DoWorkAsync
metoda jest wywoływana, tworzone jest nowe wystąpienie DefaultScopedProcessingService
klasy , a identyfikator wystąpienia jest rejestrowany.
Zastąp zawartość pliku Program.cs szablonu następującym kodem języka C#:
using App.ScopedService;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<ScopedBackgroundService>();
builder.Services.AddScoped<IScopedProcessingService, DefaultScopedProcessingService>();
IHost host = builder.Build();
host.Run();
Usługi są zarejestrowane w pliku (Program.cs). Usługa hostowana jest zarejestrowana metodą rozszerzania AddHostedService.
Aby uzyskać więcej informacji na temat rejestrowania usług, zapoznaj się z wstrzykiwaniem zależności na platformie .NET.
Weryfikowanie funkcjonalności usługi
Aby uruchomić aplikację z poziomu programu Visual Studio, wybierz pozycję F5 lub wybierz opcję menu Debuguj>rozpocznij debugowanie . Jeśli używasz CLI platformy .NET, uruchom polecenie dotnet run
z katalogu roboczego.
dotnet run
Aby uzyskać więcej informacji na temat polecenia uruchamiania interfejsu wiersza polecenia platformy .NET, zobacz dotnet run.
Pozwól aplikacji działać przez chwilę, aby wygenerować kilka wywołań metody DoWorkAsync
, co umożliwi zarejestrowanie nowych identyfikatorów wystąpień. Zobaczysz wyniki podobne do poniższych logów:
info: App.ScopedService.ScopedBackgroundService[0]
ScopedBackgroundService is running.
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService doing work, instance ID: 8986a86f-b444-4139-b9ea-587daae4a6dd
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: .\scoped-service
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService doing work, instance ID: 07a4a760-8e5a-4c0a-9e73-fcb2f93157d3
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService doing work, instance ID: c847f432-acca-47ee-8720-1030859ce354
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
info: App.ScopedService.ScopedBackgroundService[0]
ScopedBackgroundService is stopping.
W przypadku uruchamiania aplikacji z poziomu programu Visual Studio wybierz pozycję Zatrzymaj debugowanie>.... Alternatywnie wybierz Ctrl + C z okna konsoli, aby zasygnalizować anulowanie.