(这可能重复了问题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] 并开始在其中工作。
- [线程] Webapi 在该线程和其他类中创建新的 DataController 对象。
- [THREAD] 使用任务并行库在 [THREAD2] 中启动 sql-query
- [THREAD] 返回托管池,准备进行其他处理
- [THREAD2] 与 sql 驱动程序一起工作,在准备好数据时读取数据并调用 [THREAD3] 来回复 xhr 请求
- [THREAD3] 发送响应。
请随时纠正我,如果有什么问题。
他们说,在上面的问题中,重点和好处是,[THREAD2] 不是来自托管池,但是 MSDN 文章(上面的链接)说
默认情况下,并行库类型喜欢
Task
并Task<TResult>
使用线程池线程来运行任务。
所以我得出一个结论,所有三个线程都来自托管池。
此外,如果我使用同步方法,我仍然会保持我的服务器响应,只使用一个线程(来自宝贵的线程池)。
那么,从 1 个线程交换到 3 个线程的实际意义是什么?为什么不只是最大化线程池中的线程呢?
是否有任何使用异步控制器的明显有用的方法?