Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Menggunakan layanan yang terlingkup dalam
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:
- Atasi dependensi dengan cakupan dengan benar dalam singleton BackgroundService.
- Mendelegasikan pekerjaan ke layanan dengan cakupan tertentu.
- Terapkan
overrideterhadap BackgroundService.StopAsync(CancellationToken).
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
- .NET 8.0 SDK atau yang lebih baru
- Lingkungan pengembangan terintegrasi (IDE) .NET, misalnya, Visual Studio
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
DoWorkAsyncmengembalikanTaskdan menerima CancellationToken.- Metode mencatat pengidentifikasi instans—
_instanceIdditetapkan setiap kali kelas dibuat.
- Metode mencatat pengidentifikasi instans—
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.