Bir içindeki kapsamlı hizmetleri kullanma BackgroundService
Uzantı yöntemlerinden herhangi birini kullanarak uygulamalarını IHostedService kaydettiğinizde AddHostedService , hizmet tekil olarak kaydedilir. Kapsamlı bir hizmete güvenmek istediğiniz senaryolar olabilir. Daha fazla bilgi için bkz . .NET'te bağımlılık ekleme: Hizmet ömrü.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- Tek BackgroundServicebir içindeki kapsamlı bağımlılıkları çözün.
- Kapsamlı bir hizmete çalışma temsilcisi seçme.
- uygulamasının bir
override
öğesini BackgroundService.StopAsync(CancellationToken)uygulayın.
Bahşiş
".NET'te Çalışanlar" örnek kaynak kodunun tümü, indirilebilmeniz için Samples Browser'da bulunur. Daha fazla bilgi için bkz . Kod örneklerine göz atma: .NET'te çalışanlar.
Önkoşullar
- .NET 8.0 SDK veya üzeri
- .NET tümleşik geliştirme ortamı (IDE)
- Visual Studio'yu kullanmaktan çekinmeyin
Yeni proje oluşturma
Visual Studio ile yeni bir Çalışan Hizmeti projesi oluşturmak için Dosya>Yeni>Proje... seçeneğini belirlemeniz gerekir. Yeni proje oluştur iletişim kutusunda "Çalışan Hizmeti" araması yapın ve Çalışan Hizmeti şablonu'na tıklayın. .NET CLI kullanmayı tercih ediyorsanız, sık kullandığınız terminali çalışma dizininde açın. dotnet new
komutunu çalıştırın ve öğesini istediğiniz proje adıyla değiştirin<Project.Name>
.
dotnet new worker --name <Project.Name>
.NET CLI yeni çalışan hizmeti projesi komutu hakkında daha fazla bilgi için bkz . dotnet new worker.
Bahşiş
Visual Studio Code kullanıyorsanız tümleşik terminalden .NET CLI komutlarını çalıştırabilirsiniz. Daha fazla bilgi için bkz . Visual Studio Code: Tümleşik Terminal.
Kapsamlı hizmetler oluşturma
kapsamındaki hizmetleri kullanmak için bir BackgroundService
kapsam oluşturun. Barındırılan bir hizmet için varsayılan olarak hiçbir kapsam oluşturulmaz. Kapsamı belirlenmiş arka plan hizmeti, arka plan görevinin mantığını içerir.
namespace App.ScopedService;
public interface IScopedProcessingService
{
Task DoWorkAsync(CancellationToken stoppingToken);
}
Önceki arabirim tek DoWorkAsync
bir yöntemi tanımlar. Varsayılan uygulamayı tanımlamak için:
- Hizmet zaman uyumsuz.
DoWorkAsync
yöntemi birTask
döndürür. Gösterim amacıyla, yönteminde on saniyelik bir gecikme beklenmektedirDoWorkAsync
. - ILogger hizmetine eklenir.:
namespace App.ScopedService;
public sealed class DefaultScopedProcessingService(
ILogger<DefaultScopedProcessingService> logger) : IScopedProcessingService
{
private int _executionCount;
public async Task DoWorkAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
++ _executionCount;
logger.LogInformation(
"{ServiceName} working, execution count: {Count}",
nameof(DefaultScopedProcessingService),
_executionCount);
await Task.Delay(10_000, stoppingToken);
}
}
}
Barındırılan hizmet, yöntemini çağırmak DoWorkAsync
üzere kapsamlı arka plan hizmetini çözümlemek için bir kapsam oluşturur. DoWorkAsync
içinde beklenen ExecuteAsync
bir Task
döndürür:
Worker sınıfını yeniden yazma
Mevcut Worker
sınıfı aşağıdaki C# koduyla değiştirin ve dosyayı ScopedBackgroundService.cs olarak yeniden adlandırın:
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);
await DoWorkAsync(stoppingToken);
}
private async Task DoWorkAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
"{Name} is working.", ClassName);
using (IServiceScope scope = serviceScopeFactory.CreateScope())
{
IScopedProcessingService scopedProcessingService =
scope.ServiceProvider.GetRequiredService<IScopedProcessingService>();
await scopedProcessingService.DoWorkAsync(stoppingToken);
}
}
public override async Task StopAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
"{Name} is stopping.", ClassName);
await base.StopAsync(stoppingToken);
}
}
Yukarıdaki kodda açık bir kapsam oluşturulur ve IScopedProcessingService
uygulama bağımlılık ekleme hizmet kapsamı fabrikasından çözümlenir. Çözümlenen hizmet örneğinin kapsamı belirlenmiştir ve DoWorkAsync
yöntemi beklenir.
Program.cs dosya içeriğini aşağıdaki C# koduyla değiştirin:
using App.ScopedService;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<ScopedBackgroundService>();
builder.Services.AddScoped<IScopedProcessingService, DefaultScopedProcessingService>();
IHost host = builder.Build();
host.Run();
Hizmetler (Program.cs) içinde kayıtlıdır. Barındırılan hizmet uzantı yöntemiyle AddHostedService
kaydedilir.
Hizmetleri kaydetme hakkında daha fazla bilgi için bkz . .NET'te bağımlılık ekleme.
Hizmet işlevselliğini doğrulama
Uygulamayı Visual Studio'dan çalıştırmak için F5'i seçin veya Hata AyıklamaYı>Başlat Hata Ayıklama menü seçeneğini belirleyin. .NET CLI kullanıyorsanız, çalışma dizininden komutunu çalıştırın dotnet run
:
dotnet run
.NET CLI çalıştırma komutu hakkında daha fazla bilgi için bkz . dotnet run.
Uygulamanın birkaç yürütme sayısı artışı oluşturmak için bir bit boyunca çalışmasına izin verin. Aşağıdakine benzer bir çıkış görürsünüz:
info: App.ScopedService.ScopedBackgroundService[0]
ScopedBackgroundService is running.
info: App.ScopedService.ScopedBackgroundService[0]
ScopedBackgroundService is working.
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService working, execution count: 1
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 working, execution count: 2
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService working, execution count: 3
info: App.ScopedService.DefaultScopedProcessingService[0]
DefaultScopedProcessingService working, execution count: 4
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
info: App.ScopedService.ScopedBackgroundService[0]
ScopedBackgroundService is stopping.
Uygulamayı Visual Studio'dan çalıştırıyorsanız Hata Ayıklama Hata Ayıklamayı>Durdur... öğesini seçin. Alternatif olarak, iptal sinyali almak için konsol penceresinden Ctrl + C'yi seçin.