的任务.运行时不使用async或await

本文关键字:async await 任务 运行时 | 更新日期: 2023-09-27 18:01:47

如果我把我从控制器中调用的一些方法放到Task中。这到底是在做什么?我没有使用async函数,也没有使用await。

...
FunctionOne();
FunctionTwo();
return View(FunctionThree().Result);
}
private void FunctionOne()
{
        Task.Run(() =>
        {
            ....
        }
}
private void FunctionTwo()
{
        Task.Run(() =>
        {
            ....
        }
}
private Task<MyType> FunctionThree()
{
        return Task.Run(() =>
        {
            ....
        }
}

的任务.运行时不使用async或await

正如@LasseVKarlsen解释的那样,这段代码试图并行执行函数1、2和3。的任务。. result将阻塞调用线程,直到它的Task(并且只有它的Task)完成。

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

    您正在使用线程池中的四个线程来执行此操作。如果这个动作是在很重的负载下。它经常被称为——池中可用线程的数量可能成为新的瓶颈。
  • 函数一和函数二有一个本质上无限的运行时,因为没有客户端将等待他们。如果在这些函数中添加了太多的逻辑,您可能会再次耗尽池中的线程。
  • 正如@LasseVKarlsen提到的,这可能导致死锁。
  • 如果这些是cpu绑定的函数,那么并行执行它们可能不会为您带来任何好处。(然而,不等待One和Two可能会给客户端带来很多好处。)如果下面有I/O操作(例如;网络调用,数据库调用,文件系统调用),你可能想看看在ASP中使用异步控制器。
  • 正如@StephenCleary所指出的,ASP。NET不会跟踪你的线程。如果循环发生(比如当你编辑你的web.config时),它将始终完成功能3作为请求的一部分,但功能1和功能2可能被取消。

这些考虑是否建议更改您的设计是一个问题,每个函数做什么,它们需要多长时间,以及它们对您的业务逻辑有多重要。