.NET Core 實現後臺任務(定時任務)IHostedService(一)

2022-07-08 06:00:08

原文連結: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   

 

另外還有兩個GVP專案,大佬們方便的話也點下star唄,非常感謝:

  BootstrapAdmin 專案地址: