IHostedService和BackgroundService 前言 平時寫代碼的時候,大家多多少少都會遇到定時任務的要求,今天介紹兩種定時任務的寫法,嚴格來說其實是一種。 相對來說比較粗糙,請多多指教。 方法一 IHostedService 簡介 ######## IHostedService ...
IHostedService和BackgroundService
前言
平時寫代碼的時候,大家多多少少都會遇到定時任務的要求,今天介紹兩種定時任務的寫法,嚴格來說其實是一種。
相對來說比較粗糙,請多多指教。
方法一 IHostedService
簡介
######## IHostedService 介面
IHostedService 介面為主機托管的對象定義了兩種方法:
- StartAsync(CancellationToken)
- StopAsync(CancellationToken)
######## StartAsync
StartAsync(CancellationToken) 包含用於啟動後臺任務的邏輯。
StartAsync應僅限於短期任務,因為托管服務是按順序運行的,在StartAsync運行完成之前不會啟動其他服務。
######## StopAsync
StopAsync(CancellationToken) 在主機執行正常關閉時觸發。 StopAsync包含結束後臺任務的邏輯。
StopAsync中調用的任何方法都應及時返回。
第一步 Program類添加相關配置
// .Net 6
builder.Services.AddHostedService<TestHostedService>();
// .Net 5 及以下
services.AddHostedService<TestHostedService>();
第二步 創建操作類(HostedHelpsService)
public class HostedHelpsService : IHostedService, IDisposable
{
private Timer? _timer;
public Task StartAsync(CancellationToken cancellationToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object? state)
{
Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
}
public Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StopAsync");
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
方法二 BackgroundService
簡介
BackgroundService 是 IHostedService的一個簡單實現,內部IHostedService 的StartAsync調用了ExecuteAsync”,本質上就是使用了 IHostedService,BackgroundService 是用於實現長時間運行的 IHostedService 的基類。
調用 ExecuteAsync()來運行後臺服務。 實現返回一個 Task,其表示後臺服務的整個生存期。
第一步 創建服務類
public interface IWorkService
{
Task TaskWorkAsync(CancellationToken stoppingToken);
}
public class WorkService : ITaskWorkService
{
public async Task WorkAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
//執行任務
Console.WriteLine($"{DateTime.Now}");
//要添加await,不然任務將不會等待執行結果,直接進行下一個任務。
//周期性任務,於上次任務執行完成後,等待5秒,執行下一次任務
await Task.Delay(500);
}
}
}
第二步 註冊服務
builder.Services.AddScoped<IWorkService, WorkService>();
第三步 創建調用類
public class BackgroundTestService : BackgroundService
{
private readonly IServiceProvider _services;
public BackgroundTestService(IServiceProvider services)
{
_services = services;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using var scope = _services.CreateScope();
//獲取服務類
var taskWorkService = scope.ServiceProvider.GetRequiredService<IWorkService>();
//執行服務類的定時任務
await taskWorkService.TaskWorkAsync(stoppingToken);
}
}
第四步 添加主機服務
builder.Services.AddHostedService<BackgroundTestService>();