在昨天的 使用 BackgroundService 建立背景服務佇列 這篇文章中是使用內建的 BackgroundService 抽象類別自己實作在背景執行的任務佇列,在研究的時候就有發現網路上已經有其他網友將類似的功能作為套件了,可以很方便的使用,本篇就來記錄一下如果不想要自行實作,只想最簡單達成的作法
需要注意的是該佇列是整個應用程式的所有任務共用,假設有兩個 API ,分別是寄送 Email 和寄送簡訊,但是都是使用這個任務佇列,萬一寄送 Email 的任務發生問題,每次執行都要幾分鐘,那很可能會導致簡訊服務還在慢慢排隊無法執行而造成兩個服務都失效的情況,所以如果有多個任務的話建議依照上一篇自己實作,將兩個任務拆分。
參考資料:
GitHub - TwentyFourMinutes/BackgroundQueue
安裝
先使用 NuGet 安裝 BackgroundQueue 套件,或是使用 .NET CLI 執行以下指令安裝
dotnet add package BackgroundQueue
啟動(注入)服務
在 Program.cs 中加入以下程式碼:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddBackgroundTaskQueue();
var app = builder.Build();
非同步執行任務
本次直接在 Controller 中做示範,收到 API 後將任務加入至佇列中,會立即回應 API ,佇列會依序執行任務:
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
private readonly ILogger<TestController> _logger;
private readonly IBackgroundTaskQueue _taskQueue;
public TestController(ILogger<TestController> logger, IBackgroundTaskQueue taskQueue)
{
_logger = logger;
_taskQueue = taskQueue;
}
[HttpGet]
public ActionResult Get()
{
_taskQueue.Enqueue(async token =>
{
await Task.Delay(1000, token);
_logger.LogInformation("Hello World!");
});
return Ok();
}
}
需要注意的是該佇列是整個應用程式的所有任務共用,假設有兩個 API ,分別是寄送 Email 和寄送簡訊,但是都是使用這個任務佇列,萬一寄送 Email 的任務發生問題,每次執行都要幾分鐘,那很可能會導致簡訊服務還在慢慢排隊無法執行而造成兩個服務都失效的情況,所以如果有多個任務的話建議依照上一篇自己實作,將兩個任務拆分。
參考資料:
GitHub - TwentyFourMinutes/BackgroundQueue
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com