我猜这个问题可能与ASP.NET MVC4 Async controller - Why to use?重复了,但是关于WebAPI的,而且我不同意那里的答案。
假设我有一个长时间运行的SQL请求。它的数据应该被序列化为JSON并发送到浏览器(作为xhr请求的响应)。示例代码:
public class DataController : ApiController
{
public Task<Data> Get()
{
return LoadDataAsync(); // Load data asynchronously?
}
}
当我执行$.getJson('api/data', ...)(参见海报http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster.pdf)时,实际发生了什么:
- [IIS] IIS接受请求。
- [IIS] IIS等待来自托管池(http://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx)的一个线程[THREAD]并在其中开始工作。
- [THREAD] Webapi在该线程中创建新的DataController对象和其他类。
- [THREAD] 使用任务并行库在[THREAD2]中启动SQL查询。
- [THREAD] 返回托管池,准备进行其他处理。
- [THREAD2] 使用SQL驱动程序,读取数据并在准备就绪时调用[THREAD3]以回复xhr请求。
- [THREAD3] 发送响应。
如果有错误,请随时纠正我。
在上述问题中,他们说,要点和利润在于[THREAD2]不是来自托管池,然而MSDN文章(以上链接)说:“默认情况下,并行库类型如
Task
和 Task<TResult>
使用线程池线程运行任务。”所以我得出结论,所有三个线程都来自托管池。
此外,如果我使用同步方法,我仍然可以保持服务器响应,只使用一个线程(来自宝贵的线程池)。
那么,从1个线程切换到3个线程的实际意义是什么?为什么不仅仅最大化线程池中的线程数?
还有没有明显有用的使用异步控制器的方法?