[英]Asp.Net - Scheduled Task using IHostedService
我正在開發一個用 C# 編寫並托管在 Azure 虛擬機中的 ASP.NET Web 應用程序,使用 IIS 10 作為 Web 服務器。 我必須安排一個后台任務每天運行一次。 為此,我創建了以下DailyTask
類:
public class DailyTask : IHostedService {
public Task StartAsync(CancellationToken cancellationToken) {
Debug.WriteLine("start");
Task.Run(TaskRoutine, cancellationToken);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken) {
Debug.WriteLine("stop");
return null;
}
public Task TaskRoutine() {
while (true) {
try {
/* ... */
DateTime nextStop = DateTime.Now.AddDays(1);
var timeToWait = nextStop - DateTime.Now;
var millisToWait = timeToWait.TotalMilliseconds;
Thread.Sleep((int)millisToWait);
}
catch (Exception e) {
Debug.WriteLine(e);
}
}
}
}
為了開始這個任務,我在Startup
類中添加了以下語句:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
/* ... */
services.AddSingleton<Microsoft.Extensions.Hosting.IHostedService, HiddenUserCleaner>();
/* ... */
}
}
在我的測試服務器上部署后,我觀察到此解決方案工作正常。 但它可靠嗎? 如果在生產中使用會不會有問題?
這不安全。 看看這里的指南: https : //docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1&tabs=visual-studio
如果應用程序意外關閉(例如,應用程序的進程失敗),則可能不會調用 StopAsync。 因此,在 StopAsync 中調用的任何方法或執行的操作可能不會發生。
情況並非完全如此,但它假定應用程序可以重新啟動。 偶爾重新啟動的應用程序池也是如此。
總的來說,這並不能保證它會每天運行。 如果應用程序由於某種原因頻繁重啟,則可能是它從未運行過。
像hangfire這樣的庫也是如此。
其他解決方案可能是 Web 作業,或者您可以通過使用某種持久性(例如存儲上次執行時間的數據庫)來檢查它今天是否已執行,並且IHostingService
將每隔一段時間和啟動時檢查它是否應該執行后台工作並采取相應的行動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.