簡體   English   中英

如何正確處理 ASP.net Core 3 中的大型后台任務?

[英]How do I properly handle a large background task in ASP.net Core 3?

這是一個 ASP.net Core 3 MVC 應用程序。

我正在嘗試從壓縮文件中提取 XML。 然后我需要解析該 XML 文檔並根據內部數據將其轉換為實體。 這些 XML 文件可能很長。 此應用程序旨在在內部網絡上運行,自托管,並且不會面向公眾。

我知道 IHostedService 和 Worker Services 是處理長任務的兩種方法。 但是,當我研究這些選項時,它們似乎主要用於重復任務。 只有在上傳文件時,我才需要運行此任務。

使用 IHostedService 或 Worker 服務會是好的設計嗎? 畢竟可能會在 model 中處理類似的事情? 還是有其他更好的方法來完成這些任務?

ASP.NET 核心性能最佳實踐包含名為Complete long-running Tasks outside of HTTP requests 的部分

它說:

大多數對 ASP.NET 核心應用程序的請求可以由 controller 或頁面 model 調用必要的服務並返回 Z2993C6Z62A2465FF7988 響應來處理。 對於一些涉及長時間運行任務的請求,最好讓整個請求-響應過程異步進行。

建議:

  • 不要等待長時間運行的任務作為普通 HTTP 請求處理的一部分完成。
  • 請考慮使用后台服務處理長時間運行的請求或使用 Azure Function 處理進程外請求。 在進程外完成工作對 CPU 密集型任務特別有益。
  • 務必使用實時通信選項,例如 SignalR,與客戶端進行異步通信。

aspnet.net 的示例包含QueuedHostedService ,它是一個非基於時間的BackgroundService

處理部分如下所示:

private async Task BackgroundProcessing(CancellationToken stoppingToken)
{
    while (!stoppingToken.IsCancellationRequested)
    {
        var workItem = 
            await TaskQueue.DequeueAsync(stoppingToken);

        try
        {
            await workItem(stoppingToken);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, 
                "Error occurred executing {WorkItem}.", nameof(workItem));
        }
    }
}

QueuedHostedSerivce 在排隊的后台任務中進行了說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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