.NET寶藏API之:IHostedService,後臺任務執行
阿新 • • 發佈:2022-04-21
我們在專案開發的過程中可能會遇到類似後臺定時任務的需求,比如訊息佇列的消費者。
按照.NetF
時的開發習慣首先想到的肯定是Windows Service
,拜託,都什麼年代了還用Windows服務
(小聲bb)
不用 Windows服務
這不是還有Quartz
之流的包嘛,也不是不行,但是隨便一點小需求就上這麼重的包,是不是有點大材小用了。
除了上面的方案,Task.Run
也不失為一個好方法,方便簡單,直接在管道:
Task.Run(() => { while (true) { Console.WriteLine("running"); Thread.Sleep(1000); } });
Ok,搞定
嗯......也不是不行,總覺得缺了點什麼?難道是優雅?
IHostedService
IHostedService
微軟給的定義如下,大致的意思就是:定義主機託管物件的方法。
Defines methods for objects that are managed by the host.
下面我們就來實現一下:
public class WorkService : IHostedService, IDisposable { private Timer timer; public void Dispose() { timer.Dispose(); } public Task StartAsync(CancellationToken cancellationToken) { Console.WriteLine("start"); timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { Console.WriteLine("end"); timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } private void DoWork(object state) { Console.WriteLine("running"); } }
然後在 ConfigureServices
註冊:
services.AddHostedService<WorkService>();
是不是既優雅又 so easy
。
猴:放屁,本來幾行程式碼就能解決的,你這用了這麼多行才實現,優雅個屁。
彆著急,這不是贈送了兩個功能嘛:start
,end
,很划算的啦。
猴:我不要這兩個功能,我只要執行任務,你這個就是不行。
得,不要就不要,微軟大大都給你準備好了。
BackgroundService
BackgroundService
是微軟封裝的一個IHostedService
派生類,顧名思義:後臺服務嘛,往下看:
public class WorkService : BackgroundService { protected async override Task ExecuteAsync(CancellationToken stoppingToken) { while(!stoppingToken.IsCancellationRequested) { Console.WriteLine("running"); await Task.Delay(1000, stoppingToken); } } }
還是一樣的註冊:services.AddHostedService<WorkService>();
,執行結果就...還是放一下吧。
這下夠優雅了吧。
猴:那還有更優雅的嗎?
年輕人,要知足(其實我也不知道了)
因為 BackgroundService
是IHostedService
的派生類,如果你想要使用 start
和end
也是可以的哦。
public override Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("start");
return base.StartAsync(cancellationToken);
}
public override Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("end");
return base.StopAsync(cancellationToken);
}
好了,這期的寶藏API
就到這了,下期再見哦,如果有下期的話。