我正在开发 .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...
}
我的问题是:
- 为什么 Task.Run() 不允许控制器操作立即返回?
- 在 ASP.NET Core Web API 中返回即时响应的同时在后台运行 CPU 绑定任务的正确方法是什么?
- 有没有更好的方法在 ASP.NET Core 中异步处理 CPU 绑定任务?
我使用 Task.Run() 将 CPU 密集型工作卸载到后台线程,但控制器操作仍然阻塞,直到任务完成。我期望响应 Processing started... 能够在后台执行长时间运行的任务时立即返回。相反,请求似乎被阻塞,直到 LongRunningTask() 完成。
您的任务的正确选项是Background Services。如果您想运行基于队列的 Background Service ,您可以看到此链接,正如@MindSwipe所说的那样。