.NET Core 實(shí)現(xiàn)后臺任務(wù)(定時(shí)任務(wù))IHostedService(一)
原文鏈接:http://www.rzrgm.cn/ysmc/p/16456787.html
最近有小伙伴問道,在 .Net Core 中,如何定時(shí)執(zhí)行任務(wù),而因?yàn)樾枰獔?zhí)行的任務(wù)比較簡單,并不想使用其它的中間件(如 Quartz 等等),在這樣的需求下,我給大家介紹一下.Net 內(nèi)置的后臺任務(wù) IHostedService。
貫徹本人的習(xí)慣,不廢話,直接上代碼,首先我們創(chuàng)建一個類,該類繼承 IHostedService 接口,并實(shí)現(xiàn)該接口成員,同時(shí)我用到了 .NET內(nèi)置的定時(shí)器類 Timer,具體這個 Timer 是什么,我這里就不介紹了,有興趣的小伙伴可以到官方文檔了解 傳送門。
在不需要定時(shí)執(zhí)行任務(wù)的時(shí)候,也可以在這里進(jìn)行應(yīng)用啟動后的操作,例如創(chuàng)建 RabbitMQ 連接【手動狗頭】
同時(shí),我們需要在 Program.cs(.Net 5 及一下在 Startup.cs)中添加以下配置。
// .Net 6 builder.Services.AddHostedService<TestHostedService>(); // .Net 5 及以下 services.AddHostedService<TestHostedService>();
1 public class TestHostedService : IHostedService, IDisposable 2 { 3 private Timer? _timer; 4 5 public Task StartAsync(CancellationToken cancellationToken) 6 { 7 _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); 8 9 return Task.CompletedTask; 10 } 11 12 private void DoWork(object? state) 13 { 14 Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}"); 15 } 16 17 public Task StopAsync(CancellationToken cancellationToken) 18 { 19 Console.WriteLine("StopAsync"); 20 21 return Task.CompletedTask; 22 } 23 24 25 public void Dispose() 26 { 27 _timer?.Dispose(); 28 } 29 }
上面的代碼非常簡單,應(yīng)用在運(yùn)行后,會去執(zhí)行 StartAsync 函數(shù),應(yīng)用關(guān)閉執(zhí)行 StopAsync,由于我在這里使用的定時(shí)器,所以每過5秒都會執(zhí)行一次 DoWork 函數(shù),以下是運(yùn)行效果

需要注意的是,這里的定時(shí)是不等待任務(wù)執(zhí)行完成,只要時(shí)間一到,就會調(diào)用 DoWork 函數(shù),所以適合一些簡單、特定的場景,后續(xù)我將針對這些問題多寫幾個文檔,大佬們有什么建議盡管提,加油!
以下為官方文檔對 IHostedService 接口 的說明
IHostedService 接口
IHostedService 接口為主機(jī)托管的對象定義了兩種方法:
- StartAsync(CancellationToken)
- StopAsync(CancellationToken)
StartAsync
StartAsync(CancellationToken) 包含用于啟動后臺任務(wù)的邏輯。 在以下操作之前調(diào)用 StartAsync:
- 已配置應(yīng)用的請求處理管道。
- 已啟動服務(wù)器且已觸發(fā) IApplicationLifetime.ApplicationStarted。
StartAsync 應(yīng)僅限于短期任務(wù),因?yàn)橥泄芊?wù)是按順序運(yùn)行的,在 StartAsync 運(yùn)行完成之前不會啟動其他服務(wù)。
StopAsync
- StopAsync(CancellationToken) 在主機(jī)執(zhí)行正常關(guān)閉時(shí)觸發(fā)。
StopAsync包含結(jié)束后臺任務(wù)的邏輯。 實(shí)現(xiàn) IDisposable 和終結(jié)器(析構(gòu)函數(shù))以處置任何非托管資源。
默認(rèn)情況下,取消令牌會有五秒超時(shí),以指示關(guān)閉進(jìn)程不再正常。 在令牌上請求取消時(shí):
- 應(yīng)中止應(yīng)用正在執(zhí)行的任何剩余后臺操作。
StopAsync中調(diào)用的任何方法都應(yīng)及時(shí)返回。
但是,在請求取消后,將不會放棄任務(wù),調(diào)用方會等待所有任務(wù)完成。
如果應(yīng)用意外關(guān)閉(例如,應(yīng)用的進(jìn)程失敗),則可能不會調(diào)用 StopAsync。 因此,在 StopAsync 中執(zhí)行的任何方法或操作都可能不會發(fā)生。
若要延長默認(rèn)值為 5 秒的關(guān)閉超時(shí)值,請?jiān)O(shè)置:
- ShutdownTimeout(當(dāng)使用通用主機(jī)時(shí))。
- 使用 Web 主機(jī)時(shí)為關(guān)閉超時(shí)值主機(jī)配置設(shè)置。
托管服務(wù)在應(yīng)用啟動時(shí)激活一次,在應(yīng)用關(guān)閉時(shí)正常關(guān)閉。 如果在執(zhí)行后臺任務(wù)期間引發(fā)錯誤,即使未調(diào)用 StopAsync,也應(yīng)調(diào)用 Dispose。
寫在最后
Bootstrap Blazor 官網(wǎng)地址:https://www.blazor.zone
希望大佬們看到這篇文章,能給項(xiàng)目點(diǎn)個star支持下,感謝各位!
star流程:
1、訪問點(diǎn)擊項(xiàng)目鏈接:BootstrapBlazor
2、點(diǎn)擊star,如下圖,即可完成star,關(guān)注項(xiàng)目不迷路:

另外還有兩個GVP項(xiàng)目,大佬們方便的話也點(diǎn)下star唄,非常感謝:
BootstrapAdmin 項(xiàng)目地址:
https://gitee.com/LongbowEnterprise/BootstrapAdmin
SliderCaptcha 項(xiàng)目地址:
https://gitee.com/LongbowEnterprise/SliderCaptcha
交流群(QQ)歡迎加群討論
BA & Blazor ①(795206915) BA & Blazor ②(675147445)


本文來自博客園,作者:一事冇誠,轉(zhuǎn)載請注明原文鏈接:http://www.rzrgm.cn/ysmc/p/16456787.html

浙公網(wǎng)安備 33010602011771號