[英]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.