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
方法完成时,执行的线程返回到线程组
任务中执行的。请运行
我想知道整个流程的流程
由于一个线程最初是从线程组中获取的,而task.run获取一个工作线程,因此问题在于任务何时结束作业(wcf)并获取一个线程来完成请求。处理请求时使用了多少线程?您的getAllAsync
方法是一个I/O绑定操作,因为您正在进行网络调用以访问WCF服务实例
这意味着网络驱动程序将执行getAllAsync
。它是一种异步非阻塞。在异步I/O操作完成之前,不会阻止调用线程。完成后,将通知线程池
另一方面,Task.Run
是为CPU限制的操作而设计的
Task.Run
返回一个线程,用于将线程池上的工作排队。该工作将由一个CPU核心处理
因此,如果在专用线程上进行异步I/O工作(启动)调用,那么这只是在浪费宝贵的资源