在没有使用异步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相关推荐

  1. 使用ASP.NET MVC Futures 中的异步Action

    在ASP.NET MVC中使用异步是比较麻烦的,从RC1版开始ASP.NET MVC Futures中提供了几个支持异步的类. 相关的类有:AsyncActionDescriptor.AsyncCon ...

  2. 使用ASP.NET MVC Futures 中的异步Action 【转】

    之前看过老赵这两篇文章.也研究了一下老赵异步的实现方式. 不过感觉自己扩展的话,在ASP.NET MVC中使用异步还真是麻烦,刚好看到从RC1版开始 ASP.NET MVC Futures中提供了几个 ...

  3. 从零开始学习 ASP.NET MVC 1.0 (三) Controller/Action 深入解析与应用实例 【转】

    一.摘要 一个Url请求经过了Routing处理后会调用Controller的Action方法. 中间的过程是怎样的? Action方法中返回ActionResult对象后,如何到达View的? 本文 ...

  4. ASP.NET MVC中同步与异步

    1.MvcHandler总是调用BeginProcessRequest/EndProcessRequest方法以异步的方式来处理请求 2.Controller分别实现了IController和IAsy ...

  5. ASP.NET MVC 第三章 异步提交数据

    好长时间都没写文章了本来不准备在写文章了,但是我又为什么今天发表文章咧,第一是为了我自己对技术的认识.第二是为了新手不知道怎么去学习MVC写次系列文章. 废话结束吧,接下来我们看看怎么异步实现提交数据 ...

  6. Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法【转发】

    Html.partial和RenderPartial的用法与区别 Html.partial和RenderPartial都是输出html片段,区别在于 Partial是将视图内容直接生成一个字符串并返回 ...

  7. 转载ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别

    对这四个的区别做一个总结,清理一下思路,方便以后使用: 1.带有Render的方法返回值是void,在方法内部进行输出:不带的返回值类型为MvcHtmlString,所以只能这样使用:     @Ht ...

  8. ASP.NET MVC ActionMethodSelectorAttribute 以及HttpGet等Action特性

    一.ActionMethodSelectorAttribute 其是一个抽象类,继承自Attribute,子类有NonActionAttribute.HttpGetAttribute.HttpPost ...

  9. 走入asp.net mvc不归路:[4]说说Action有哪些常见成员

    一个控制器中,功能最终会落实到一个个Action中实现,最常见的是增删查改操作.这些Action是一个个的方法,一般返回值是ActionResult,并且是public 方法,可以带参数,可以添加元标 ...

最新文章

  1. 百度地图手绘线坐标获取
  2. 源码地址php实战第十二天
  3. Android防火墙原型系统设计,Android系统网络安全性研究及防火墙设计
  4. 初学redux笔记,及一个最简单的redux实例
  5. 老男孩linux运维50期
  6. 13新功能_再聊聊灵感盒 -Marginnote 3.6.12/13新功能
  7. 经验总结21--抓取WEB数据,汇率,HtmlAgilityPack
  8. 磁盘管理 之 parted命令添加swap,文件系统
  9. 计算机课评课的常用语,评课常用语
  10. w8的计算机管理打不开,Win8.1系统打不开控制面板怎么办 win8.1无法打开控制面板如何解决...
  11. php flash斗地主,flash斗地主
  12. 笔记本电脑装android系统安装教程,电脑安装安卓系统教程 三分钟教学换装系统...
  13. 区块链开发用什么语言好?
  14. 文件共享服务器热备,两台云服务器如何实现双机热备
  15. 随心所欲的“四舍五入” 之 ROUNDUP函数如何使用?
  16. [从头读历史] 第244节 三皇与五帝
  17. 1503 Problem A 最简分式
  18. Eclipse Maven clean后错误: 找不到或无法加载主类com.xxx.ShopApplication
  19. win10显卡相关配置
  20. 韦东山嵌入式第一期学习笔记DAY_1——3_2_shell命令解析器功能说明

热门文章

  1. 【运维面试】面试官问到tcp/ip三次握手,四次挥手,这么回答就对了
  2. GPU上的随机森林:比Apache Spark快2000倍
  3. 蓝桥杯2017省赛C/C++A组题1迷宫题解(深搜dfs)
  4. java 二进制转ascii码_Unicode码的二进制转换(Java)
  5. mBlock机器人组装教程_如何使用Makeblock构造Delta机器人
  6. 计算机毕业设计Java超市管理系统(源码+系统+mysql数据库+lw文档
  7. IEEE-754单精度浮点类型有效数字理解(画图不易,望点赞支持)
  8. sublime不认识python_sublime关于python27的一个大坑
  9. win10怎么更新显卡驱动_解决win10系统声卡驱动故障没有声音怎么办?
  10. 出国(东南亚)工作的华为数通工程师机会,欢迎投递简历