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:

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

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 BackgroundServicekapsam 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 bir Taskdöndürür. Gösterim amacıyla, yönteminde on saniyelik bir gecikme beklenmektedir DoWorkAsync .
  • 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. DoWorkAsynciçinde beklenen ExecuteAsyncbir Taskdö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.

Ayrıca bkz.