没有异步或等待的Task.Run

问题描述 投票:0回答:1

如果我把我正在调用的一些方法从我的控制器调到Task.Run这究竟是做什么的?我没有使用异步功能,我没有使用等待。

...
FunctionOne();
FunctionTwo();
return View(FunctionThree().Result);
}

private void FunctionOne()
{
        Task.Run(() =>
        {
            ....
        }
}

private void FunctionTwo()
{
        Task.Run(() =>
        {
            ....
        }
}

private Task<MyType> FunctionThree()
{
        return Task.Run(() =>
        {
            ....
        }
}
c# task
1个回答
2
投票

正如@LasseVKarlsen解释的那样,此代码尝试并行执行函数一,二和三。 Task.Run立即将线程池上的指定工作排队,.Result将阻塞调用线程,直到它的Task(并且只有它的任务)完成。

这可能是也可能不是一个好的设计。有些事情需要考虑:

  • 您正在使用线程池中的四个线程来执行此操作。如果这个动作负载很重 - 即。它经常被调用 - 池中可用线程的数量可能成为新的瓶颈。
  • 函数一和二有一个基本无界的运行时,因为没有客户端会等待它们。如果向这些函数添加了太多逻辑,则可能会再次耗尽池中的线程。
  • 正如@LasseVKarlsen所提到的,这可能会导致deadlock
  • 如果这些是CPU限制的功能,那么并行执行它们可能不会给你带来什么。 (但是,不等待One和Two可能会大量购买客户端。)如果下面有I / O操作(例如网络调用,数据库调用,文件系统调用),您可能需要查看Using an Asynchronous Controller in ASP.NET MVC
  • 正如@StephenCleary指出的那样,ASP.NET不会跟踪你的线程。如果发生循环(例如,当您编辑web.config时),它将始终完成函数Three作为请求的一部分,但One和Two可能会被取消。

这些考虑因素是否表明您的设计发生了变化,这是一个问题,即每个功能的作用,使用时间以及它们对您的业务逻辑的重要性。

© www.soinside.com 2019 - 2024. All rights reserved.