Arabirimi uygulama IHostedService
Sağlananların ötesinde sınırlı denetime ihtiyacınız varsa BackgroundService , kendi uygulamanızı uygulayabilirsiniz IHostedService . IHostedServiceArabirim, .net 'teki tüm uzun çalışan hizmetlerin temelini oluşturur. Özel uygulamalar AddHostedService<THostedService>(IServiceCollection) uzantı yöntemiyle kaydedilir.
Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:
- IHostedServiceVe IAsyncDisposable arabirimlerini uygulayın.
- Zamanlayıcı tabanlı bir hizmet oluşturun.
- Özel uygulaşmayı bağımlılık ekleme ve günlüğe kaydetme ile kaydedin.
İpucu
".NET 'teki çalışanlar" örnek kaynak kodu, indirmek üzere Samples Browser 'da bulunabilir. Daha fazla bilgi için bkz. kod örneklerine gözatıyor: .net Içindeki çalışanlar.
Önkoşullar
- .Net 5,0 SDK veya üzeri
- .NET tümleşik geliştirme ortamı (IDE)
- Visual Studio kullanmayı ücretsiz yapın
Yeni proje oluşturma
Yeni bir Çalışan Hizmeti projesi oluşturmak Visual Studio Dosya Yeni Proje... seçeneğini > > belirtirsiniz. Yeni proje oluştur iletişim kutusunda "Çalışan Hizmeti" araması yazın ve Çalışan Hizmeti şablonunu seçin. .NET CLI kullanmak yerine sık kullanılan terminali bir çalışma dizininde açın. komutunu dotnet new çalıştırın ve yerine <Project.Name> istediğiniz proje adını yazın.
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.
İpucu
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.
Zamanlayıcı hizmeti oluştur
Zamanlayıcı tabanlı arka plan hizmeti, System.Threading.Timer sınıfını kullanır. Zamanlayıcı DoWork yöntemini tetikler. Zamanlayıcı devre dışı bırakılır IHostLifetime.StopAsync(CancellationToken) ve hizmet kapsayıcısı bırakıldığında bırakıldı IAsyncDisposable.DisposeAsync() :
WorkerŞablondan içeriğini aşağıdaki C# koduyla değiştirin ve dosyayı Timerservice. cs olarak yeniden adlandırın:
namespace App.TimerHostedService;
public sealed class TimerService : IHostedService, IAsyncDisposable
{
private readonly Task _completedTask = Task.CompletedTask;
private readonly ILogger<TimerService> _logger;
private int _executionCount = 0;
private Timer? _timer;
public TimerService(ILogger<TimerService> logger) => _logger = logger;
public Task StartAsync(CancellationToken stoppingToken)
{
_logger.LogInformation($"{nameof(TimerHostedService)} is running.");
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
return _completedTask;
}
private void DoWork(object? state)
{
int count = Interlocked.Increment(ref _executionCount);
_logger.LogInformation(
$"{nameof(TimerHostedService)} is working, execution count: {{Count:#,0}}",
count);
}
public Task StopAsync(CancellationToken stoppingToken)
{
_logger.LogInformation(
$"{nameof(TimerHostedService)} is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return _completedTask;
}
public async ValueTask DisposeAsync()
{
if (_timer is IAsyncDisposable timer)
{
await timer.DisposeAsync();
}
_timer = null;
}
}
Önemli
, Worker Öğesinin bir alt sınıfıdır BackgroundService . Artık, TimerService IHostedService ve IAsyncDisposable arabirimlerini uygular.
, TimerService sealed Ve DisposeAsync örneğinden gelen çağrıyı basamakdan çıkar _timer . "Geçişli Dispose deseninin" hakkında daha fazla bilgi için bkz. DisposeAsync yöntemi uygulama.
StartAsyncÇağrıldığında Zamanlayıcı örneği oluşturulur ve bu nedenle Zamanlayıcı başlar.
İpucu
, Timer Önceki yürütmelerin bitmesini beklemez, bu DoWork nedenle gösterilen yaklaşım her senaryo için uygun olmayabilir. Interlocked.Increment , birden çok iş parçacığının eşzamanlı olarak güncelleştirilmesini sağlayan bir atomik işlem olarak yürütme sayacını artırmak için kullanılır _executionCount .
Var olan Program içeriği aşağıdaki C# koduyla değiştirin:
using App.TimerHostedService;
using IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<TimerService>();
})
.Build();
await host.RunAsync();
Hizmet, IHostBuilder.ConfigureServices uzantı yöntemiyle (program. cs) kaydedilir AddHostedService . Bu, BackgroundService her ikisi de arabirimini uygularsa, alt sınıfları kaydederken kullandığınız genişletme yöntemidir IHostedService .
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 menü seçeneğini belirleyin. .NET CLı kullanıyorsanız, dotnet run çalışma dizininden komutunu çalıştırın:
dotnet run
.NET CLı Run komutu hakkında daha fazla bilgi için bkz. DotNet Run.
Uygulamanın birkaç yürütme sayısı artışlarını oluşturmak için bir bit çalışmasına izin verin. Aşağıdakine benzer bir çıktı görürsünüz:
info: App.TimerHostedService.TimerService[0]
TimerHostedService is running.
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: .\timer-service
info: App.TimerHostedService.TimerService[0]
TimerHostedService is working, execution count: 1
info: App.TimerHostedService.TimerService[0]
TimerHostedService is working, execution count: 2
info: App.TimerHostedService.TimerService[0]
TimerHostedService is working, execution count: 3
info: App.TimerHostedService.TimerService[0]
TimerHostedService is working, execution count: 4
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
info: App.TimerHostedService.TimerService[0]
TimerHostedService is stopping.
Uygulamayı uygulamanın içinde çalıştırıyorsanız hata Visual Studio Hata Ayıklamayı > Durdur... öğesini seçin. Alternatif olarak, iptali işaret etmek için konsol penceresinden Ctrl + C'yi seçin.
Ayrıca bkz.
Göz önünde bulundurulması gereken birkaç ilgili öğretici vardır: