原文鏈接:https://www.cnblogs.com/ysmc/p/16456787.html 最近有小伙伴問道,在 .Net Core 中,如何定時執行任務,而因為需要執行的任務比較簡單,並不想使用其它的中間件(如 Quartz 等等),在這樣的需求下,我給大家介紹一下.Net 內置的後臺任務 ...
原文鏈接:https://www.cnblogs.com/ysmc/p/16456787.html
最近有小伙伴問道,在 .Net Core 中,如何定時執行任務,而因為需要執行的任務比較簡單,並不想使用其它的中間件(如 Quartz 等等),在這樣的需求下,我給大家介紹一下.Net 內置的後臺任務 IHostedService。
貫徹本人的習慣,不廢話,直接上代碼,首先我們創建一個類,該類繼承 IHostedService 介面,並實現該介面成員,同時我用到了 .NET內置的定時器類 Timer,具體這個 Timer 是什麼,我這裡就不介紹了,有興趣的小伙伴可以到官方文檔瞭解 傳送門。
在不需要定時執行任務的時候,也可以在這裡進行應用啟動後的操作,例如創建 RabbitMQ 連接【手動狗頭】
同時,我們需要在 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 }
上面的代碼非常簡單,應用在運行後,會去執行 StartAsync 函數,應用關閉執行 StopAsync,由於我在這裡使用的定時器,所以每過5秒都會執行一次 DoWork 函數,以下是運行效果
需要註意的是,這裡的定時是不等待任務執行完成,只要時間一到,就會調用 DoWork 函數,所以適合一些簡單、特定的場景,後續我將針對這些問題多寫幾個文檔,大佬們有什麼建議儘管提,加油!
以下為官方文檔對 IHostedService 介面 的說明
IHostedService 介面
IHostedService 介面為主機托管的對象定義了兩種方法:
- StartAsync(CancellationToken)
- StopAsync(CancellationToken)
StartAsync
StartAsync(CancellationToken) 包含用於啟動後臺任務的邏輯。 在以下操作之前調用 StartAsync
:
- 已配置應用的請求處理管道。
- 已啟動伺服器且已觸發 IApplicationLifetime.ApplicationStarted。
StartAsync
應僅限於短期任務,因為托管服務是按順序運行的,在 StartAsync
運行完成之前不會啟動其他服務。
StopAsync
- StopAsync(CancellationToken) 在主機執行正常關閉時觸發。
StopAsync
包含結束後臺任務的邏輯。 實現 IDisposable 和終結器(析構函數)以處置任何非托管資源。
預設情況下,取消令牌會有五秒超時,以指示關閉進程不再正常。 在令牌上請求取消時:
- 應中止應用正在執行的任何剩餘後臺操作。
StopAsync
中調用的任何方法都應及時返回。
但是,在請求取消後,將不會放棄任務,調用方會等待所有任務完成。
如果應用意外關閉(例如,應用的進程失敗),則可能不會調用 StopAsync
。 因此,在 StopAsync
中執行的任何方法或操作都可能不會發生。
若要延長預設值為 5 秒的關閉超時值,請設置:
- ShutdownTimeout(當使用通用主機時)。
- 使用 Web 主機時為關閉超時值主機配置設置。
托管服務在應用啟動時激活一次,在應用關閉時正常關閉。 如果在執行後臺任務期間引發錯誤,即使未調用 StopAsync
,也應調用 Dispose
。
寫在最後
Bootstrap Blazor 官網地址:https://www.blazor.zone
希望大佬們看到這篇文章,能給項目點個star支持下,感謝各位!
star流程:
1、訪問點擊項目鏈接:BootstrapBlazor
2、點擊star,如下圖,即可完成star,關註項目不迷路:
另外還有兩個GVP項目,大佬們方便的話也點下star唄,非常感謝:
BootstrapAdmin 項目地址:
https://gitee.com/LongbowEnterprise/BootstrapAdmin
SliderCaptcha 項目地址:
https://gitee.com/LongbowEnterprise/SliderCaptcha
交流群(QQ)歡迎加群討論
BA & Blazor ①(795206915) BA & Blazor ②(675147445)