我在我的.NET Core应用程序中有这段代码:
[HttpPost]
[Route("doSomething")]
public async Task<IActionResult> DoSomethingAsync([FromBody] Input input)
{
// Do Something
var task1 = Task.Run(async () =>
{
await taskFactory.DoTask(input);
});
// Do Something Differently
var task2 = Task.Run(async () =>
{
await taskFactory.DoAnotherTask(input);
});
await Task.WhenAll(task1, task2);
return Accepted();
}
DoTask()
和DoAnotherTask()
都是彼此独立的,可以并行执行,但必须等待它们都处于完成状态。
因此,我创建了两个任务,并使用Task.WhenAll()
等待它们。
但我收到了一条评论,指出在异步方法中不要使用Task.Run()
,因为这可能会导致线程池饥饿。
问题1:我的代码如何导致线程池饥饿?
问题2:如果它导致线程池饥饿,我该如何并行运行这两个任务?
Task.Run
而不是直接从DoTask
返回任务? - DavidGawait
来自Task.Run
的结果,而是捕获任务以在Task.WhenAll
中使用,您也可以对DoTask
和DoAnotherTask
的结果执行相同操作。 - juharrTask.Run
中的原因是,如果它们在执行任何async
代码之前有 CPU 绑定的代码。 - juharrTask.Run
将工作排队在线程池上运行,因此如果过度使用,可能会耗尽所有线程。 - Johnathan Barclay