[英]Running background tasks periodically in an ASP.NET Core RC2 application
我正在研究ASP.NET Core RC2應用程序。 此應用程序需要定期調用某些任務,例如發送電子郵件或調用特定的業務邏輯。
我知道有一些第三方庫,如Hangfire或Quartz.NET,可以提供開箱即用的調度功能。 但是我不認為其中任何一個當前都支持ASP.NET Core RC2。 是否有任何其他可用的選項與ASP.NET Core RC2兼容?
如果沒有,我想一個可能的選擇是在一個單獨的Windows服務中使用這些第三方庫之一,然后可以定位支持的.NET版本。 然后,該服務可以通過其Web API定期向ASP.NET應用程序發出請求,以便調用任務。
但是我不希望有單獨的服務,因為它增加了移動部件的數量並使我們的應用程序的部署變得復雜。
手動方法:
Service
包含長期運行的代碼,最好是async
async
)向服務添加while
循環 Task.Run(() => ...
或在線程池(或在傳統Thread
)在新線程中調用服務類的長時間運行方法。 services.AddSingleton(MyServiceInstance);
在Configure(...
在Startup.cs中 如果您的目標是完整的.NET CLR,那么以前工作的任何庫都可以使用。 在RC2中沒有改變。 Azure WebJobs是另一種解決方案,除了您已經提到的解決方案之外。
對於CoreCLR,我不知道任何已經兼容的框架。 您可能必須提出自己的解決方案,或者通過在完整的.NET中使用所有計划的代碼或者在完整的.NET中調用CoreCLR來創建一個小應用程序來分解您的應用程序。
我們使用一個簡單的“任務運行器”應用程序,它接受命令行參數來確定要調用的Web / Windows服務。 然后使用Windows任務計划程序調用“任務運行程序”應用程序。 因此,服務是什么或者寫入的技術並不重要。
你總是可以給Quartz v3構建一個go。 它已經在CoreCLR上運行,測試幾乎已經過去了。 您需要使用Visual Studio自己構建源代碼。 請參閱v3分支 。
目前最大的警告是不兼容的序列化,因為v2只能將二進制序列化為數據庫(作業數據映射等),而v3僅支持JSON作為序列化格式。 這個故事可能會改變,因為他們計划將BinaryFormatter帶回來。
所以我會說如果你很樂意使用RAMJobStore而沒有數據庫持久性,你應該是金色的。 它可能比手工制作的解決方案更好。
ASP.NET Core支持使用托管服務運行后台任務,請參閱此文檔 。 它有一個名為IHostedService的接口,用於用戶定義的托管服務。 該接口為主機管理的對象定義了兩種方法:
您還可以通過實現ExecuteAsync方法繼承抽象類BackgroundService ,如下所示:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
stoppingToken.Register(() =>
_logger.LogDebug($"Background task is stopping."));
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogDebug($"Background task doing work.");
DoTask();
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
定義托管服務后,需要將它們作為單例添加到ServiceCollection 。 然后這些后台任務將在asp.net核心應用程序中運行。
考慮使用https://github.com/fluentscheduler/FluentScheduler 。
工作的例子很簡單
JobManager.AddJob(() => Console.WriteLine("My job!"),
(s) => s.ToRunEvery(5).Seconds());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.