Asynchronous Task.run在asp.net请求中占用两个线程?

Asynchronous Task.run在asp.net请求中占用两个线程?,asynchronous,task,task-parallel-library,Asynchronous,Task,Task Parallel Library,服务层 public async Task<string> getAllAsync() { return await WCFMethodAsync(); } 公共异步任务getAllAsync() { 返回等待WCFMethodAsync(); } 表示层 public class Customer : Controller { public async Task<string> Index() { var r = await Task.

服务层

public async Task<string> getAllAsync()
{
   return await WCFMethodAsync();
}
公共异步任务getAllAsync() { 返回等待WCFMethodAsync(); } 表示层

public class Customer  : Controller
{
   public async Task<string> Index()
  {
      var r = await Task.Run(getAllAsync());
    return r;

  }
}
公共类客户:控制器
{
公共异步任务索引()
{
var r=wait Task.Run(getAllAsync());
返回r;
}
}
我将描述我认为正在发生的事情。我想知道我是否错了

  • 该请求从线程池中获取一个线程

  • wait
    返回未完成的任务

  • Task.Run
    将要运行的任务排队
    getAllAsync

    3.1. 这将从线程池中获取一个线程

  • getAllAsync
    方法完成时,执行的线程返回到线程组

  • 当通知服务方法调用end.net并从线程组中提取一个线程以终止请求时

  • 未完成的作业在哪里归还?因为该方法是在
    任务中执行的。请运行

    我想知道整个流程的流程


    由于一个线程最初是从线程组中获取的,而task.run获取一个工作线程,因此问题在于任务何时结束作业(wcf)并获取一个线程来完成请求。处理请求时使用了多少线程?

    您的
    getAllAsync
    方法是一个I/O绑定操作,因为您正在进行网络调用以访问WCF服务实例

    这意味着网络驱动程序将执行
    getAllAsync
    。它是一种异步非阻塞。在异步I/O操作完成之前,不会阻止调用线程。完成后,将通知线程池


    另一方面,
    Task.Run
    是为CPU限制的操作而设计的

    Task.Run
    返回一个线程,用于将线程池上的工作排队。该工作将由一个CPU核心处理


    因此,如果在专用线程上进行异步I/O工作(启动)调用,那么这只是在浪费宝贵的资源