C# 异步方法中的Task.Run()会导致线程池不足吗?

C# 异步方法中的Task.Run()会导致线程池不足吗?,c#,.net-core,async-await,C#,.net Core,Async Await,我的.netcore应用程序中有这段代码 [HttpPost] [Route("doSomething")] public async Task<IActionResult> DoSomethingAsync([FromBody] Input input) { // Do Something var task1 = Task.Run(async () => { await taskFactory.DoTask(input); }

我的.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();
}
[HttpPost]
[路线(“剂量测定”)]
公共异步任务DoSomethingAsync([FromBody]输入)
{
//做点什么
var task1=Task.Run(异步()=>
{
等待taskFactory.DoTask(输入);
});
//做些不同的事情
var task2=Task.Run(异步()=>
{
等待taskFactory.DoNotherTask(输入);
});
等待任务。WhenAll(任务1,任务2);
返回已接受();
}
DoTask()
DoAnotherTask()
都是相互独立的,可以并行执行,但必须等待它们都处于完成状态

因此,我创建了两个任务,并使用
Task.WhenAll()
等待它们

但是我得到了一条评论,建议不要在
async
方法中使用
Task.Run()

问题1:我的代码如何导致线程池不足?

问题2:如果导致线程池不足,我如何并行运行这两个任务?

对于线程池不足问题,如果运行一个已经异步的任务,则使用task.run执行2个新任务,并在其中运行每个调用5个任务的2个异步方法,然后,您将等待这两个任务的完成,并且每个请求有6个任务

我通常这样做smth,你仍然有4个任务,但最终池将持续更长时间

[HttpPost]
[Route("doSomething")]
public async Task<IActionResult> DoSomethingAsync([FromBody] Input input)
{
    // Do Something
    var t1 = taskFactory.DoTask(input);

    // Do Something Differently
    var t2 = taskFactory.DoAnotherTask(input);


    await Task.WhenAll(t1, t2);

    return Accepted();
}

[HttpPost]
[路线(“剂量测定”)]
公共异步任务DoSomethingAsync([FromBody]输入)
{
//做点什么
var t1=taskFactory.DoTask(输入);
//做些不同的事情
var t2=taskFactory.DoAnotherTask(输入);
等待任务时(t1,t2);
返回已接受();
}

要自信地回答您的问题,我们必须了解
DoTask
DoAnotherTask
方法的实现。在不知道的情况下,我们可以假设它们已正确实现,并遵循异步方法的规则,即立即返回
任务
,而不阻塞调用线程。在这种假设下,答案是:不,您的代码不会导致线程池不足。这是因为所使用的线程要做的工作量可以忽略不计,只需创建一个
任务
对象,因此它几乎会立即返回到
线程池


应该指出的是,尽管使用
Task.Run
包装行为良好的异步委托对
线程池的运行状况影响甚微,但也没有任何好处。看看这个半相关的问题:

为什么要执行
任务。在这里运行
,而不是仅仅从
DoTask
返回任务,您是如何诊断线程池不足是您的问题的?请注意,您如何不等待任务的结果。运行任务,而捕获任务以在任务中使用。在所有任务中,您也可以对任务的结果执行相同的操作。@DavidG Yes,这是可以避免的。这是不必要的。但我只是想了解它将如何导致线程池不足。将这些调用打包到
任务中的唯一原因是运行
之前,如果他们在执行
异步
代码之前有CPU绑定的代码。这可能是一种更好的方法,但是没有回答关于线程池饥饿是否有风险的OP问题,就像他的代码审阅者告诉他们的那样。