原文連結: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 介面為主機託管的物件定義了兩種方法:
StartAsync
StartAsync(CancellationToken) 包含用於啟動後臺任務的邏輯。 在以下操作之前呼叫 StartAsync
:
StartAsync
應僅限於短期任務,因為託管服務是按順序執行的,在 StartAsync
執行完成之前不會啟動其他服務。
StopAsync
StopAsync
包含結束後臺任務的邏輯。 實現 IDisposable 和終端子(解構函式)以處置任何非託管資源。預設情況下,取消令牌會有五秒超時,以指示關閉程序不再正常。 在令牌上請求取消時:
StopAsync
中呼叫的任何方法都應及時返回。但是,在請求取消後,將不會放棄任務,呼叫方會等待所有任務完成。
如果應用意外關閉(例如,應用的程序失敗),則可能不會呼叫 StopAsync
。 因此,在 StopAsync
中執行的任何方法或操作都可能不會發生。
若要延長預設值為 5 秒的關閉超時值,請設定:
託管服務在應用啟動時啟用一次,在應用關閉時正常關閉。 如果在執行後臺任務期間引發錯誤,即使未呼叫 StopAsync
,也應呼叫 Dispose
。
Bootstrap Blazor 官網地址:https://www.blazor.zone
希望大佬們看到這篇文章,能給專案點個star支援下,感謝各位!
star流程:
1、存取點選專案連結:BootstrapBlazor
另外還有兩個GVP專案,大佬們方便的話也點下star唄,非常感謝:
BootstrapAdmin 專案地址: