线程池
一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个版本,才能趋于规范。 ASP.NET MVC 中为什么需要使用异步呢,IIS有一个线程池来处理用户的请求,当一个新的请求过来时,将调度池中的线程以处理该请求,然而,但并发量很高的情况下,池中的线程已经不能够满足这么多的请求时候,池中的每一个线程都处于忙的状态则在处理请求时将阻塞处理请求的线程,并且该线程不能对另一个请求提供服务,如果请求队列已满,则 Web 服务器会拒绝请求并处于 HTTP 503繁忙状态。如果是处理一些高延迟,例如网络操作,这样的线程大多数只是等待状态大部分时间是不做任何事情的,这样的线程就可以使用异步编程更好的充分利用。
异步处理
例如:如果某个请求生成一个需要两秒钟来完成的网络调用,则该请求无论是同步执行还是异步执行都需要两秒钟。 但是,在异步调用的过程中,服务器在等待第一个请求完成的过程中不会阻塞对其他请求的响应。 因此,当有许多请求调用长时间运行的操作时,异步请求可以防止出现请求排队的情况。在.NET 4.5中最大线程池为 5000 .NET 4.5中也增加了 await与async关键字来简化异步编程。
同步还是异步(摘录MSDN)
通常,在满足以下条件时使用同步管线:
-
操作很简单或运行时间很短。
-
简单性比效率更重要。
-
此操作主要是 CPU 操作而不是包含大量的磁盘或网络开销的操作。 对 CPU 绑定操作使用异步操作方法未提供任何好处并且还导致更多的开销。
通常,在满足以下条件时使用异步管线:
-
操作是网络绑定的或 I/O 绑定的而不是 CPU 绑定的。
-
测试显示阻塞操作对于网站性能是一个瓶颈,并且通过对这些阻塞调用使用异步操作方法,IIS 可对更多的请求提供服务。
-
并行性比代码的简单性更重要。
-
您希望提供一种可让用户取消长时间运行的请求的机制。
ASP.NET MVC 中使用异步
// GET: Async [AsyncTimeout(1000)] public async TaskIndex() { var data = await GetPageTaskAsync("http://163.com"); return data; } /// /// 处理异步请求 /// /// ///public async Task 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 exception) { throw exception; // TODO: Logging, update statistics etc. } } }
Refer:
when-should-i-use-async-controllers-in-asp-net-mvc
看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?The Managed Thread Pool Using an Asynchronous Controller in ASP.NET MVC Tips and Tricks on how to improve MVC Application Performance Using Asynchronous Methods in ASP.NET MVC 4 Asynchronous Action Methods in MVC 4
ASP.NET MVC下的异步Action的定义和执行原理
异步编程中的最佳做法