在 ASP.NET MVC 中使用异步控制器
线程池
一直想把项目改写成异步,但是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()]
- public async Task<ActionResult> Index()
- {
- var data = await GetPageTaskAsync("http://163.com");
return data;- }
- /// <summary>
- /// 处理异步请求
- /// </summary>
- /// <param name="url"></param>
- /// <returns></returns>
- public async Task<ActionResult> GetPageTaskAsync(string url)
- {
- try
- {
- using (var client = new HttpClient())
- {
- await Task.Delay();
- 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
http://stackoverflow.com/questions/30566848/when-should-i-use-async-controllers-in-asp-net-mvc
看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?
http://www.cnblogs.com/farb/p/5014773.html
The Managed Thread Poolhttp://msdn.microsoft.com/zh-cn/library/0ka9477y.aspx
Using an Asynchronous Controller in ASP.NET MVChttp://msdn.microsoft.com/zh-cn/library/ee728598%28v=vs.100%29.aspx
Tips and Tricks on how to improve MVC Application Performancehttp://www.robertsindall.co.uk/blog/how-to-improve-mvc-application-performance/
Using Asynchronous Methods in ASP.NET MVC 4http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4
Asynchronous Action Methods in MVC 4http://www.codeproject.com/Tips/573154/Asynchronous-Action-Methods-in-MVC-4
ASP.NET MVC下的异步Action的定义和执行原理
http://www.cnblogs.com/artech/archive/2012/06/20/async-action-in-mvc.html异步编程中的最佳做法
在 ASP.NET MVC 中使用异步控制器的更多相关文章
- ASP.NET MVC中使用异步控制器
线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个 ...
- ASP.NET MVC4中的异步控制器
在抛弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需要再蛋疼的给每个Action写两个方法, 也无需傻傻的手动对异步Action计数器增减了(AsyncMa ...
- ASP.NET MVC中从后台控制器(Controller)传递数据到前台页面视图(View)方式
方式一: 数据存储模型Model: public class CalendarEvent { public string id { get; set; } public DateTime start ...
- Asp.net MVC中如何获取控制器的名称
如果在代码中 当前controller.action的获取RouteData.Route.GetRouteData(this.HttpContext).Values["controller& ...
- ASP.NET MVC EF 中使用异步控制器
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 为什么使用异步操作/线程池 ASP.NET MVC ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- 看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?
转载自博客园:http://farb.cnblogs.com/ 今天无意中看到stackoverflow上一个很好的问答,个人觉得很有价值,所以翻译过来和大家共享!希望大家能相互交流. 在ASP.NE ...
- ASP.NET MVC中使用ASP.NET AJAX异步访问WebService
使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也 ...
- 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】
Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一个控制器 2017-2-2 ...
随机推荐
- php 安装扩展
安装mysqli扩展 1.到php文件ext下的mysqli cd /usr/local/php-7.1.5/ext/mysqli 2.在mysqli文件夹下执行 /usr/local/ph ...
- c 语言申明头文件和实现分开简单例子
很多时候,看到很多c函数的声明和实现是分开的.声明放在头文件,实现却放在另一个文件,最后函数被其他文件调用. 下面以简单例子说明. 一.声明部分 /* test.h */ #include <s ...
- c简单的单向链表
ps:list链表 node节点 在链表中节点就是一个个的结构体 堆空间由于在申请内存时,地址是随机的,所以要用链表的方式将其连接起来,但是链表头的地址要知道. 每个节点包含两个部分:数据区和地址区 ...
- How to Start a Business in 10 Days
With an executive staffing venture about to open, a business loan from the in-laws gnawing at her co ...
- 微信小程序-bindtap事件与冒泡
bindtap就是点击事件 在.wxml文件绑定: <text id='textId' data-userXxx='100' bindtap='tapMessage'>cilck here ...
- [ X.XX]CF每日一题系列线下更新中
现在做的都好水啊,就不写博客了,线下有记录滴
- SRM480
250pt: 题意:给定n个网站,以及n个网站的关键词,还有一个危险词库.如果一个网站的关键词中>=th的危险词,那么这个网站便是危险的.同时,他的所有关键词加入危险词库.问,有多少个危险网站. ...
- 完美融合 nextjs 和 antd
相信大家在使用nextjs的时候,难免遇到一些坑.其实可能大部分原因在于 nextjs 做了很多封装,我们可能不能第一时间搞清楚包括它相关的所有配置,比如其中的webpack配置.我前面也写过 SSR ...
- tensorflow 安装命令
sudo pip install --upgrade --ignore-installed six tensorflow-0.9.0-py2-none-any.whl
- WPF异常捕获三种处理 UI线程, 全局异常,Task异常
protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);RegisterEvents();} private v ...