为什么在处理长时间运行的 CPU 密集型任务时,Task.Run() 会阻止控制器操作?

问题描述 投票:0回答:1

我正在开发 .NET 6 Web API,并使用 Task.Run() 处理 CPU 密集型任务,将其卸载到后台线程。但是,我的控制器操作似乎仍然被阻止,并且请求没有按预期立即返回。

代码示例:

[HttpGet("process-data")]
public IActionResult ProcessData()
{
    Task.Run(() => LongRunningTask());
    
    return Ok("Processing started...");
}

private void LongRunningTask()
{
    // Simulating a long CPU-bound task
    Thread.Sleep(5000);
    // Further processing...
}

我的问题是:

  1. 为什么 Task.Run() 不允许控制器操作立即返回?
  2. 在 ASP.NET Core Web API 中返回即时响应的同时在后台运行 CPU 密集型任务的正确方法是什么?
  3. 是否有更好的方法在 ASP.NET Core 中异步处理 CPU 密集型任务?

我使用 Task.Run() 将 CPU 密集型工作卸载到后台线程,但控制器操作仍然会阻塞,直到任务完成。我希望在长时间运行的任务在后台执行时立即返回响应“处理开始...”。相反,请求似乎被阻止,直到 LongRunningTask() 完成。

c# .net-core async-await task-parallel-library
1个回答
0
投票

适合您任务的正确选项是后台服务。如果您想运行基于队列的后台服务,您可以看到这个链接,如@MindSwipe所说。

© www.soinside.com 2019 - 2024. All rights reserved.