【发布时间】:2020-08-05 16:10:04
【问题描述】:
我的 .netcore 应用程序中有这段代码
[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() 等待它们。
但是我有一条评论说不要在async 方法中使用Task.Run(),因为它会导致线程池饥饿。
问题 1:我的代码如何导致线程池饥饿?
问题2:如果导致线程池饥饿,如何并行运行两个任务?
【问题讨论】:
-
你为什么在这里做
Task.Run而不是仅仅从DoTask返回任务? -
另外,您如何诊断出线程池饥饿是您的问题?
-
请注意您如何不使用
await来自Task.Run的结果,而是捕获要在Task.WhenAll中使用的任务,您也可以对来自DoTask的结果执行相同操作,并且DoAnotherTask代替。 -
@DavidG 是的,这是可以避免的。这是不必要的。但只是想了解它是如何导致线程池饥饿的。
-
将这些调用封装在
Task.Run中的唯一原因是,如果它们在执行任何async代码之前预先具有 CPU 绑定代码。
标签: c# .net-core async-await