ASP.NET MVC 3中的异步 Action 通过两个匹配的方法XxxAsync/XxxCompleted 来定义,这样的异步 Action 只能定义在继承自 AsyncConoller 的类型中。 ASP.NET MVC 4 提供
了一种更加简洁的异步 Action 定义方式,不过为了兼容前一版本,传统的定义方式和AsyncController 类型依然被保留下来。为什么我们需要让 Action 方法异步地执行呢?要回答
这个问题,这就需要了解 ASP.NET 基于线程池 Thread Pool 的请求处理机制。

1. 基于线程池的请求处理机制
ASP.NET 通过线程池的机制处理并发的 HTTP 请求。一个 Web 应用内部维护着一个线程池,当探测到抵达的请求后, ASP.NET 会从池中获取一个空闲的线程来处理它。处理完毕
后,线程不会被回收,而是重新释放到池中。线程池具有一个最大容量,如果创建的线程达到这个上限并且现有的线程均被处于"忙碌"状态,新的 HTTP 请求会被放入一个请求队列
以等待某个线程重新释放到池中。
我们将这些用于处理 HTTP 请求的线程称为工作线程 (Worker Thread) ,而这个线程池自然就叫做工作线程池。

ASP. NET这种基于线程池的请求处理机制主要具有如下两个优势。
  • 工作线程的重用:创建线程的成本虽然不如进程的激活,却也不是一件一蹦而就的事情,
频繁地创建和释放线程会对性能造成极大的损害。线程池机制避免了总是创建新的工作线程来处理每一个请求,被创建的工作线程得到了极大地重用,并最终提高了服务器的吞吐能力。
  • 工作线程数量的限制:资源的有限性决定了服务器处理请求的能力具有一个上限,或者说某台服务器能够处理的请求并发量具有一个临界点,一旦超过这个临界点,整个服务
器将会因不能提供足够的资源而崩溃。由于采用了对工作线程数量具有良好控制的线程池机制, ASP. 并发处理的请求数量不可能超过线程池的最大允许的容量,从而避
免了在高并发情况下工作线程的无限制创建而最终导致整个服务器的崩溃。如果请求处理操作耗时较短,工作线程处理完毕后可以及时地被释放到线程池中以用于
对下一个请求的处理。但是对于比较耗时的操作来说,意味着工作线程将长时间被某个请求独占,如果这样的操作访问比较频繁,在高并发的情况下在线程池中可能找不到空闲的工作
线程用于及时处理最新抵达的请求。如果采用异步的方式来处理这样的耗时请求,工作线程可以让后台线程来接手,而自己可以及时地被释放到线程池中用于进行后续请求的处理,从而提高了整个服务器的吞吐能
力。值得一提的是,异步操作主要用于I1 绑定操作(比如数据库访问和远程服务调用等),而非 CPU 绑定操作,因为异步操作对整体性能的提升来源于当 I/O 设备在处理某个任务的
时候, CPU 可以释放出来去处理另一个任务。如果耗时操作主要依赖于本机 CPU 的运算,用异步方法反而会因为线程调度和线程上下文的切换而影响整体的性能。

2.两种异步 Action 万法的定义

  2.1 XxxAsync/XxxCompleted
  如果使用两个匹配的方法 xxA sync lX xxCompleted 来定义异步 Action ,可以将异步操作实现在 xxA sync 方法中,而将最终内容的响应实现在Xx xCompleted 方法中。 XxxCompleted
可以看成是对 Async 方法的回调,当定义在 xxA sync 方法中的操作以异步方式完成执行后, XxxCompleted 方法会被自动调用。Xx xCompleted 的定义方式和普通的同步 Action
法比较类似。

    public class HomeController : AsyncController{//AsyncControllerpublic void ArticleAsync(string name){//ASP.NETMVC 发起异步操作开始 IncrementAsyncManager.OutstandingOperations.Increment(2);Task.Factory.StartNew(() =>{AsyncManager.Parameters["content"] = "ArticleContent:" + name;//ASP.NETMVC 发起异步操作结束
                    AsyncManager.OutstandingOperations.Decrement();});Task.Factory.StartNew(() =>{AsyncManager.Parameters["content"] = "ArticleContent:" + name;//ASP.NETMVC 发起异步操作结束 显示操作 AsyndManager.Finish();
                AsyncManager.Finish();});}public ActionResult ArticleCompleted(string content){string str = content;return Content(content);}
}

  2.2Task 返回值

  如果采用上面的异步 Action 定义方式,意味着我们不得不为一个 Action 定义两个方法,实际上可以通过一个方法来完成对异步 Action 的定义,那就是让 Action 方法返回一个代表
异步操作的 Task 对象。除此之外,以 XxxAsync/XxxCompleted 形式定义的异步 Action 只能出现在继承自 AsyncController 的类型中,而针对 Task 返回值的异步 Action 则对此没有限制。
实际上保留 AsyncController 这个抽象类主要是为了实现对 AS NETMVC 3的向后兼容。

上面通过 XxxAsync /XxxCompleted 形式定义的异步 Action 可以采用如下的定义方式。

  public class HomeController : Controller{//Task 返回值public Task<ActionResult> Article(string name){return Task.Factory.StartNew(() =>{AsyncManager.Parameters["content"] = "TaskArticle:" + name;}).ContinueWith<ActionResult>(task =>{string content = (string)AsyncManager.Parameters["content"];return Content(content);});}
}

转载于:https://www.cnblogs.com/dragon-L/p/4664688.html

异步 Action 的定义相关推荐

  1. ASP.NET MVC下的异步Action的定义和执行原理

    Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我 ...

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

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

  3. 为ASP.NET MVC扩展异步Action功能(下)

    本文分为上下两部分,您也可以从<Extend ASP.NET MVC for Asynchronous Action>获得全部内容. 执行Action方法 对于执行同步Action的Syn ...

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

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

  5. [译] Don’t call me, I’ll call you:使用 Redux-Saga 管理 React 应用中的异步 action (上)...

    原文地址:Don't call me, I'll call you: Side effects management with Redux-Saga (Part 1) 原文作者:David Dvora ...

  6. reactjs redux异步action

    编码步骤 异步逻辑挪到action中 引入并应用中间件,让redux支持异步action yarn add redux-thunk 改造action

  7. F#与ASP.NET(1):基于事件的异步模式与异步Action

    提高ASP.NET应用程序伸缩性的有效手段之一便是使用异步请求.而在ASP.NET MVC 1中是不能直接支持异步Action的,因此我们需要使用一些简单的Hack方式来实现这一点.不过简单的Hack ...

  8. 2 中间件的使用、异步action的创建

    react-redux是react插件 将所有组件分成两大类:UI组件和容器组件 安装npm install react-redux -S UI组件: 只负责UI的呈现,不带有任何业务逻辑 不使用th ...

  9. Portal-Basic Java Web 应用开发框架:应用篇(十四) —— 异步 Action

    Portal-Basic Java Web应用开发框架(简称 Portal-Basic)是一套功能完备的高性能Full-Stack Web应用开发框架,内置稳定高效的MVC基础架构和DAO框架(已内置 ...

  10. [Redux/Mobx] Redux中异步action和同步action最大的区别是什么?

    [Redux/Mobx] Redux中异步action和同步action最大的区别是什么? 同步action:执行了dispatch函数之后,对应的reducer纯函数立即得到执行,reducer执行 ...

最新文章

  1. matlab中nchoosek函数的用法
  2. mac下android环境搭建笔记(android studio)
  3. 阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!
  4. [转载] python3.5 利用openpyxl模块来处理excel表
  5. 权限管理----用户与角色关系
  6. Skype for Business 2015全新部署_07.前端安装02
  7. (四)Ubuntu 14.04 文件服务器--samba的安装和配置
  8. 你要的《高性能MySQL》.pdf
  9. 使用钢片刷锡膏的一种解决方案
  10. 如何理解二元函数的可导与可微?
  11. iOS面试题与核心基础之性能优化
  12. Docker可视化工具 DockerUI 和 Shipyard 的区别
  13. 微信小程序实现素材旋转——非canvas
  14. 真正从零开始搭建网站—宝塔面板+wordpress(超详细教程)
  15. 服务器维护灵魂兽刷新吗,抓灵魂兽的各种辛酸,魔兽世界猎人当年抓灵魂兽用过的黑科技漫谈...
  16. 计算机视觉——KNN算法以及手势识别应用
  17. 2022第四届长安杯复盘
  18. linux 网络监测工具
  19. 中科院、MIT等5大专家解读黑瞳:金融业幕后的新一代反欺诈卫士
  20. 百度网盘 备份mysql数据库_利用百度云免费备份SQL数据库

热门文章

  1. python复制文件到指定文件夹并重命名_python文件、文件夹的移动、复制、删除、重命名...
  2. 【牛客练习赛60:C】操作集锦(dp+子序列计数)
  3. hdoj2046骨牌铺方格题解+拓展(递推/斐波那契)
  4. C语言中与字符串有关函数讨论以及安全性能问题
  5. 极客大学架构师训练营 大数据平台、Sqoop、Canal、Flume、物联网平台 第27课 听课总结
  6. python给每个key添加数据_一文看懂Python collections模块的高效数据类型
  7. 2021-09-02Hive
  8. FP-growth发现频繁项集
  9. html字段集,禁用HTML DOM字段集的属性
  10. 什么是document对象?如何获取文档对象上的元素?_JavaScript DOM操作元素的方法,你还记得多少?...