繁体   English   中英

Task.Run无需异步或等待

[英]Task.Run without async or await

如果我将要从控制器调用的一些方法放入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(() =>
        {
            ....
        }
}

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

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

  • 您正在使用线程池中的四个线程来执行此操作。 如果此操作在重负载下- 它经常被称为-您池中可用线程的数量可能会成为新的瓶颈。
  • 函数1和2具有基本上不受限制的运行时,因为没有客户端会在它们上面等待。 如果向这些功能添加了太多的逻辑,则可能再次耗尽池中的线程。
  • 正如@LasseVKarlsen提到的那样,这可能导致死锁
  • 如果这些是受CPU约束的功能,那么并行执行它们可能不会给您带来任何好处。 (但是,不等待一个和两个可能会大量购买客户端 。)如果下面有I / O操作(例如,网络调用,数据库调用,文件系统调用),则可能要考虑在ASP中使用异步控制器。 .NET MVC代替。
  • 正如@StephenCleary所指出的,ASP.NET不会跟踪您的线程。 如果发生回收(例如,在编辑web.config时),它将始终完成功能三,作为请求的一部分,但可能会取消一和二。

这些考虑是否暗示您的设计发生了变化,这是每个功能的作用,花费的时间以及它们对您的业务逻辑的重要性的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM