一直想把项目改写成异步,可是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每个成熟的东西,都要演变好几个版本,才能趋于规范。 ASP.NET MVC 中为何须要使用异步呢,IIS有一个线程池来处理用户的请求,当一个新的请求过来时,将调度池中的线程以处理该请求,然而,但并发量很高的状况下,池中的线程已经不可以知足这么多的请求时候,池中的每个线程都处于忙的状态则在处理请求时将阻塞处理请求的线程,而且该线程不能对另外一个请求提供服务,若是请求队列已满,则 Web 服务器会拒绝请求并处于 HTTP 503繁忙状态。若是是处理一些高延迟,例如网络操做,这样的线程大多数只是等待状态大部分时间是不作任何事情的,这样的线程就可使用异步编程更好的充分利用。 html
例如:若是某个请求生成一个须要两秒钟来完成的网络调用,则该请求不管是同步执行仍是异步执行都须要两秒钟。 可是,在异步调用的过程当中,服务器在等待第一个请求完成的过程当中不会阻塞对其余请求的响应。 所以,当有许多请求调用长时间运行的操做时,异步请求能够防止出现请求排队的状况。在.NET 4.5中最大线程池为 5000 .NET 4.5中也增长了 await与async关键字来简化异步编程。 编程
一般,在知足如下条件时使用同步管线: 服务器
操做很简单或运行时间很短。网络
简单性比效率更重要。并发
此操做主要是 CPU 操做而不是包含大量的磁盘或网络开销的操做。 对 CPU 绑定操做使用异步操做方法未提供任何好处而且还致使更多的开销。异步
一般,在知足如下条件时使用异步管线: async
操做是网络绑定的或 I/O 绑定的而不是 CPU 绑定的。异步编程
测试显示阻塞操做对于网站性能是一个瓶颈,而且经过对这些阻塞调用使用异步操做方法,IIS 可对更多的请求提供服务。性能
并行性比代码的简单性更重要。测试
您但愿提供一种可以让用户取消长时间运行的请求的机制。
ASP.NET MVC 中使用异步控制器
#region 一、异步请求 [AsyncTimeout(1000)] public async Task<ActionResult> Index() { var data = await GetPageTaskAsync("http://163.com"); return data; } public async Task<ActionResult> GetPageTaskAsync(string url) { try { using (var client = new HttpClient()) { await Task.Delay(3000); var fetchTextTask = client.GetStringAsync(url); return Json(new { fetchText = await fetchTextTask,error="NO" },JsonRequestBehavior.AllowGet); } } catch (WebException ex) { throw ex; } } #endregion