Aracılığıyla paylaş


Bir içindeki kapsamlı hizmetleri kullanma BackgroundService

IHostedService uygulamalarını, herhangi bir AddHostedService uzantı yöntemini kullanarak kaydettiğinizde, hizmet singleton olarak kaydedilir. Kapsamlı bir hizmete güvenmek istediğiniz senaryolar olabilir. Daha fazla bilgi için bkz. Hizmet ömrü.

Bu eğitimde şunları öğreniyorsunuz:

Tavsiye

".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

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 <Project.Name> ifadesini istediğiniz proje adıyla değiştirin.

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.

Tavsiye

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

Kapsamlı hizmetleri bir BackgroundService içinde kullanmak için, IServiceScopeFactory.CreateScope() API'si ile bir 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. DefaultScopedProcessingService.cs adlı yeni bir sınıfta uygulama oluşturun:

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;
    }
}
  • ILogger birincil oluşturucu kullanılarak hizmete eklenir.
  • DoWorkAsync yöntemi bir Task döndürür ve değerini CancellationTokenkabul eder.
    • yöntemi örnek tanımlayıcısını günlüğe kaydeder; _instanceId sınıfın örneği her başlatıldığında atanı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);

        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);
    }
}

Önceki kodda, stoppingToken iptal edilmezken, IServiceScopeFactory bir kapsam oluşturmak için kullanılır. IServiceScope'dan IScopedProcessingService çözümlenir. DoWorkAsync yöntemi beklenir ve stoppingToken yönteme geçirilir. Son olarak yürütme 10 saniye geciktirilir ve döngü devam eder. Yöntem her çağrıldığında, DoWorkAsync'nin yeni bir örneği oluşturulur ve örnek tanımlayıcısı günlüğe kaydedilir.

Şablon 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 kaydedilir. Barındırılan hizmet, AddHostedService uzantı yöntemiyle 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, DoWorkAsync aracılığıyla birkaç çağrı oluşturup yeni örnek tanımlayıcılarını günlüğe kaydetmesi için bir süreliğine çalışmasına izin verin. Çıktıyı aşağıdaki günlüklere benzer şekilde görürsünüz:

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.

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.

Ayrıca bakınız