ASP.NET MVC什么时候使用异步Action
在没有使用异步Action之前,在Action内,比如有如下的写法:
public ActionResult Index()
{
CustomerHelper cHelper = new CustomerHelper();
List<Customer> result = cHelper.GetCustomerData();
return View(result);
}
以上,假设,GetCustomerData方法是调用第三方的服务,整个过程都是同步的,大致是:
→请求来到Index这个Action
→ASP.NET从线程池中抓取一个线程
→执行GetCustomerData方法调用第三方服务,假设持续8秒钟的时间,执行完毕
→渲染Index视图
在执行执行GetCustomerData方法的时候,由于是同步的,这时候无法再从线程池抓取其它线程,只能等到GetCustomerData方法执行完毕。
这时候,可以改善一下整个过程。
→请求来到Index这个Action
→ASP.NET从线程池中抓取一个线程服务于Index这个Action方法
→同时,ASP.NET又从线程池中抓取一个线程服务于GetCustomerData方法
→渲染Index视图,同时获取GetCustomerData方法返回的数据
所以,当涉及到多种请求,比如,一方面是来自客户的请求,一方面需要请求第三方的服务或API,可以考虑使用异步Action。
假设有这样的一个View Model:
public class Customer
{
public int Id{get;set;}
public Name{get;set;}
}
假设使用Entity Framework作为ORM框架。
public class CustomerHelper
{
public async Task<List<Customer>> GetCustomerDataAsync()
{
MyContenxt db = new MyContext();
var query = from c in db.Customers
orderby c.Id ascending
select c;
List<Customer> result = awai query.ToListAsycn();
return result;
}
}
现在就可以写一个异步Action了。
public async Task<ActionResult> Index()
{
CustomerHelper cHelper = new CustomerHelper();
List<Customer> result = await cHlper.GetCustomerDataAsync();
return View(result);
}
Index视图和同步的时候相比,并没有什么区别。
@model List<Customer>
@foreach(var customer in Model)
{
<span>@customer.Name</span>
}
当然,异步还设计到一个操作超时,默认的是45秒,但可以通过AsyncTimeout特性来设置。
[AsyncTimeout(3000)]
public async Task<ActionResult> Index()
{
...
}
如果不想对操作超时设限。
[NoAsyncTimeout]
public async Task<ActionResult> Index()
{
...
}
综上,当涉及到调用第三方服务的时候,就可以考虑使用异步Action。async和await是异步编程的2个关键字,async总和Action成对出现,而在调用异步方法之前要加上await关键字。
ASP.NET MVC什么时候使用异步Action相关推荐
- 使用ASP.NET MVC Futures 中的异步Action
在ASP.NET MVC中使用异步是比较麻烦的,从RC1版开始ASP.NET MVC Futures中提供了几个支持异步的类. 相关的类有:AsyncActionDescriptor.AsyncCon ...
- 使用ASP.NET MVC Futures 中的异步Action 【转】
之前看过老赵这两篇文章.也研究了一下老赵异步的实现方式. 不过感觉自己扩展的话,在ASP.NET MVC中使用异步还真是麻烦,刚好看到从RC1版开始 ASP.NET MVC Futures中提供了几个 ...
- 从零开始学习 ASP.NET MVC 1.0 (三) Controller/Action 深入解析与应用实例 【转】
一.摘要 一个Url请求经过了Routing处理后会调用Controller的Action方法. 中间的过程是怎样的? Action方法中返回ActionResult对象后,如何到达View的? 本文 ...
- ASP.NET MVC中同步与异步
1.MvcHandler总是调用BeginProcessRequest/EndProcessRequest方法以异步的方式来处理请求 2.Controller分别实现了IController和IAsy ...
- ASP.NET MVC 第三章 异步提交数据
好长时间都没写文章了本来不准备在写文章了,但是我又为什么今天发表文章咧,第一是为了我自己对技术的认识.第二是为了新手不知道怎么去学习MVC写次系列文章. 废话结束吧,接下来我们看看怎么异步实现提交数据 ...
- Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法【转发】
Html.partial和RenderPartial的用法与区别 Html.partial和RenderPartial都是输出html片段,区别在于 Partial是将视图内容直接生成一个字符串并返回 ...
- 转载ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
对这四个的区别做一个总结,清理一下思路,方便以后使用: 1.带有Render的方法返回值是void,在方法内部进行输出:不带的返回值类型为MvcHtmlString,所以只能这样使用: @Ht ...
- ASP.NET MVC ActionMethodSelectorAttribute 以及HttpGet等Action特性
一.ActionMethodSelectorAttribute 其是一个抽象类,继承自Attribute,子类有NonActionAttribute.HttpGetAttribute.HttpPost ...
- 走入asp.net mvc不归路:[4]说说Action有哪些常见成员
一个控制器中,功能最终会落实到一个个Action中实现,最常见的是增删查改操作.这些Action是一个个的方法,一般返回值是ActionResult,并且是public 方法,可以带参数,可以添加元标 ...
最新文章
- 百度地图手绘线坐标获取
- 源码地址php实战第十二天
- Android防火墙原型系统设计,Android系统网络安全性研究及防火墙设计
- 初学redux笔记,及一个最简单的redux实例
- 老男孩linux运维50期
- 13新功能_再聊聊灵感盒 -Marginnote 3.6.12/13新功能
- 经验总结21--抓取WEB数据,汇率,HtmlAgilityPack
- 磁盘管理 之 parted命令添加swap,文件系统
- 计算机课评课的常用语,评课常用语
- w8的计算机管理打不开,Win8.1系统打不开控制面板怎么办 win8.1无法打开控制面板如何解决...
- php flash斗地主,flash斗地主
- 笔记本电脑装android系统安装教程,电脑安装安卓系统教程 三分钟教学换装系统...
- 区块链开发用什么语言好?
- 文件共享服务器热备,两台云服务器如何实现双机热备
- 随心所欲的“四舍五入” 之 ROUNDUP函数如何使用?
- [从头读历史] 第244节 三皇与五帝
- 1503 Problem A 最简分式
- Eclipse Maven clean后错误: 找不到或无法加载主类com.xxx.ShopApplication
- win10显卡相关配置
- 韦东山嵌入式第一期学习笔记DAY_1——3_2_shell命令解析器功能说明
热门文章
- 【运维面试】面试官问到tcp/ip三次握手,四次挥手,这么回答就对了
- GPU上的随机森林:比Apache Spark快2000倍
- 蓝桥杯2017省赛C/C++A组题1迷宫题解(深搜dfs)
- java 二进制转ascii码_Unicode码的二进制转换(Java)
- mBlock机器人组装教程_如何使用Makeblock构造Delta机器人
- 计算机毕业设计Java超市管理系统(源码+系统+mysql数据库+lw文档
- IEEE-754单精度浮点类型有效数字理解(画图不易,望点赞支持)
- sublime不认识python_sublime关于python27的一个大坑
- win10怎么更新显卡驱动_解决win10系统声卡驱动故障没有声音怎么办?
- 出国(东南亚)工作的华为数通工程师机会,欢迎投递简历