Rus*_*fin 25 task-parallel-library asynccontroller async-await asp.net-web-api
(这可能与ASP.NET MVC4异步控制器问题重复- 为什么要使用?,但关于webapi,我不同意那里的答案)
假设我有一个长时间运行的SQL请求.它的数据应序列化为JSON并发送到浏览器(作为xhr请求的响应).示例代码:
public class DataController : ApiController
{
public Task<Data> Get()
{
return LoadDataAsync(); // Load data asynchronously?
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行$ .getJson('api/data',...)时会发生什么(请参阅此海报http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster. pdf):
如果出现问题,请随时纠正我.
在上面的问题中,他们说,点和利润是,[THREAD2]不是来自托管池,但MSDN文章(上面的链接)说
默认情况下,并行库类型类似
Task并Task<TResult>使用线程池线程来运行任务.
所以我得出结论,所有三个线程都来自托管池.
此外,如果我使用同步方法,我仍然只使用一个线程(来自宝贵的线程池)保持我的服务器响应.
那么,从1个线程交换到3个线程的实际意义是什么?为什么不在线程池中最大化线程?
有没有明显有用的方法来使用异步控制器?
Ste*_*ary 29
我认为关键的误解是关于async任务如何运作.我在我的博客上有一个可能有帮助的async介绍.
特别是,方法Task返回的async不会运行任何代码.相反,它只是通知调用者该方法结果的便捷方式.您引用的MSDN文档仅适用于实际运行代码的任务,例如Task.Run.
顺便说一下,你引用的海报与线程无关.这是async数据库请求中发生的事情(略微简化):
DataController等如果你想要一些概念验证代码,我有一个旧的Gist,它人为地将ASP.NET线程池限制为核心数(这是它的最小设置),然后进行N + 1个同步和异步请求.该代码只是延迟一秒而不是联系SQL服务器,但一般原则是相同的.
| 归档时间: |
|
| 查看次数: |
17755 次 |
| 最近记录: |