原文鏈接: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)


轉載請註明出處,本文鏈接:https://www.uj5u.com/net/498540.html
標籤:.NET Core
