如果不使用Quartz、Hangfire,一些簡單的定時任務完全可以用BackgroundService搞定,這是我在家為arm開發服務的時候發現的一種簡單定時任務的方式,它不用那么多框架性的東西,原生net6,輕松自在
新建一個服務類,繼承BackgroundService,重寫ExecuteAsync方法
public class MyTimedBackgroundService : BackgroundService
{
private static readonly int _spendSecond = 10;
private static int SecondsUntilMidnight()
{
return (int)(DateTime.Now.AddSeconds(_spendSecond) - DateTime.Now).TotalSeconds;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var countdown = SecondsUntilMidnight();
while (!stoppingToken.IsCancellationRequested)
{
if (countdown-- <= 0)
{
try
{
await OnTimerFiredAsync(stoppingToken);
}
catch (Exception ex)
{
// TODO: log exception
}
finally
{
countdown = SecondsUntilMidnight();
}
}
await Task.Delay(1000, stoppingToken);
}
}
private async Task OnTimerFiredAsync(CancellationToken stoppingToken)
{
// do your work here
Console.WriteLine("Simulating heavy I/O bound work");
await Task.Delay(2000, stoppingToken);
}
}
最后在startup.cs注冊服務:
services.AddHostedService<MyTimedBackgroundService>();
重啟
搞定!
題外話:
在使用這個service之前,我新建了一個net6.0項目,我發現竟然沒有startup.cs
文件,而且由於使用了global using
, program.cs
沒有了using
和function
,想注冊這個服務該怎么辦?
很簡單,使用閉包函數
var builder = WebApplication.CreateBuilder(args);
ConfigureConfiguration(builder.configuration);//基本配置
ConfigureServices(builder.Services);//注冊各種服務
var app = builder.Build();
ConfigureMiddleware(app, app.Services);//配置中間件
ConfigureEndpoints(app, app.Services);//配置終端
app.Run();
void ConfigureConfiguration(ConfigurationManager configuration) {
//todo
}
void ConfigureServices(IServiceCollection services) {
services.AddHostedService<MyTimedBackgroundService>();//注冊后台服務
}
void ConfigureMiddleware(IApplicationBuilder app, IServiceProvider services) {
//todo
}
void ConfigureEndpoints(IEndpointRouteBuilder app, IServiceProvider services) {
//todo
}
最近在學習net6.0,雖然這玩意兒發布蠻久了,但是想在網上搜到某些固定的問題還是會碰到描述不全的情況。dotnet至少語言特性是其他語言沒法比的,寫起來比較爽,我個人的小項目還是喜歡用dotnet一些,不知道你是怎么看待dotnet的?