Menggunakan layanan yang terlingkup dalam BackgroundService

Ketika Anda mendaftarkan implementasi IHostedService menggunakan salah satu metode ekstensi AddHostedService, layanan tersebut akan terdaftar sebagai singleton. Mungkin ada skenario di mana Anda ingin mengandalkan layanan tercakup. Untuk informasi selengkapnya, lihat Masa pakai layanan.

Dalam tutorial ini, Anda akan belajar cara:

Petunjuk / Saran

Semua kode sumber contoh "Pekerja di .NET" tersedia di Browser Sampel untuk diunduh. Untuk informasi selengkapnya, lihat Menelusuri sampel kode: Pekerja di .NET.

Prasyarat

Membuat proyek baru

Untuk membuat proyek Layanan Pekerja baru dengan Visual Studio, Anda akan memilih File>Baru>Proyek.... Dari dialog Buat proyek baru mencari "Layanan Pekerja", dan pilih templat "Layanan Pekerja". Jika Anda lebih suka menggunakan .NET CLI, buka terminal favorit Anda di direktori kerja. Jalankan perintah dotnet new, dan ganti <Project.Name> dengan nama proyek yang Anda inginkan.

dotnet new worker --name <Project.Name>

Untuk informasi selengkapnya tentang perintah proyek layanan pekerja baru .NET CLI, lihat dotnet new worker.

Petunjuk / Saran

Jika Anda menggunakan Visual Studio Code, Anda dapat menjalankan perintah .NET CLI dari terminal terintegrasi. Untuk informasi selengkapnya, lihat Visual Studio Code: Terminal Terintegrasi.

Membuat layanan terlingkup

Untuk menggunakan layanan terlingkup dalam BackgroundService, buat cakupan dengan IServiceScopeFactory.CreateScope() API. Tidak ada cakupan yang dibuat untuk layanan yang dihosting secara default. Layanan latar belakang yang ditentukan berisi logika tugas latar belakang.

namespace App.ScopedService;

public interface IScopedProcessingService
{
    Task DoWorkAsync(CancellationToken stoppingToken);
}

Antarmuka sebelumnya mendefinisikan satu DoWorkAsync metode. Buat implementasi di kelas baru bernama 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;
    }
}
  • ILogger disuntikkan ke dalam layanan menggunakan konstruktor utama.
  • Metode DoWorkAsync mengembalikan Task dan menerima CancellationToken.
    • Metode mencatat pengidentifikasi instans— _instanceId ditetapkan setiap kali kelas dibuat.

Tulis ulang kelas Pekerja

Ganti kelas yang ada Worker dengan kode C# berikut, dan ganti nama file menjadi 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);
    }
}

Dalam kode sebelumnya, meskipun stoppingToken tidak dibatalkan, IServiceScopeFactory digunakan untuk membuat cakupan. Dari IServiceScope, IScopedProcessingService diselesaikan. Metode DoWorkAsync ditunggu selesai, dan stoppingToken diteruskan ke metode. Akhirnya, eksekusi tertunda selama 10 detik dan perulangan berlanjut. Setiap kali metode dipanggil DoWorkAsync , instans DefaultScopedProcessingService baru dibuat dan pengidentifikasi instans dicatat.

Ganti templat Program.cs konten file dengan kode C# berikut:

using App.ScopedService;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<ScopedBackgroundService>();
builder.Services.AddScoped<IScopedProcessingService, DefaultScopedProcessingService>();

IHost host = builder.Build();
host.Run();

Layanan terdaftar di (Program.cs). Layanan yang dihosting terdaftar menggunakan metode tambahan AddHostedService.

Untuk informasi selengkapnya tentang mendaftarkan layanan, lihat Injeksi Dependensi di .NET.

Memverifikasi fungsionalitas layanan

Untuk menjalankan aplikasi dari Visual Studio, pilih F5 atau pilih opsi menu Debug>Mulai Debugging . Jika Anda menggunakan .NET CLI, jalankan dotnet run perintah dari direktori kerja:

dotnet run

Untuk informasi selengkapnya tentang perintah jalankan .NET CLI, lihat dotnet run.

Biarkan aplikasi berjalan sebentar untuk menghasilkan beberapa panggilan ke DoWorkAsync, sehingga mencatat pengidentifikasi instans baru. Anda melihat output yang mirip dengan log berikut:

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.

Jika menjalankan aplikasi dari dalam Visual Studio, pilih Debug>Hentikan Penelusuran Kesalahan.... Atau, pilih Ctrl + C dari jendela konsol untuk memberi sinyal pembatalan.

Lihat juga