gpt4 book ai didi

c# - 异步方法中的 Task.Run() 导致线程池饥饿?

转载 作者:行者123 更新时间:2023-12-05 02:07:58 25 4
gpt4 key购买 nike

我的 .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(),因为它会导致线程池饥饿。

问题一:我的代码是怎么导致线程池饥饿的?
问题2:如果是线程池饥饿,如何并行运行两个任务?

最佳答案

要自信地回答您的问题,我们必须知道 DoTaskDoAnotherTask 方法的实现。在不知道的情况下,我们可以假设它们已正确实现并遵循异步方法的礼仪,即立即返回 Task,而不会阻塞调用线程。在此假设下,答案是:不,您的代码不会导致线程池饥饿。这是因为 ThreadPool Task.Run 使用的线程有很少的工作要做,这只是创建一个 Task 对象,所以它几乎会立即返回到 ThreadPool

应该指出的是,尽管使用 Task.Run 包装行为良好的异步委托(delegate)对 ThreadPool 的健康影响微乎其微,但它也没有任何好处。看看这个半相关的问题:Is Task.Run considered bad practice in an ASP .NET MVC Web Application?

关于c# - 异步方法中的 Task.Run() 导致线程池饥饿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61368509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com