簡體   English   中英

在ASP.NET Core RC2應用程序中定期運行后台任務

[英]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 )在新線程中調用服務類的長時間運行方法。
  • 在Startup.cs中創建該類的實例
  • 使用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的接口,用於用戶定義的托管服務。 該接口為主機管理的對象定義了兩種方法:

  • StartAsync(CancellationToken) - 在服務器啟動並且觸發IApplicationLifetime.ApplicationStarted后調用。
  • StopAsync(CancellationToken) - 在主機執行正常關閉時觸發。

您還可以通過實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM