ASP.NET MVC中同步与异步

1.MvcHandler总是调用BeginProcessRequest/EndProcessRequest方法以异步的方式来处理请求

2.Controller分别实现了IController和IAsyncController两个接口,所以当激活的Controller对象在MvcHandler的BeginProcessRequest方法中是按照这样的方式执行的:Controller的类型实现了IAsyncController接口,则调用BeginExecute/EndExecute方法以异步的方式执行Controller;否则Controller的执行通过调用Execute方法以同步方式执行,但是Controller类型具有一个受保护的只读属性DisableAsyncSupport用于表示是否禁用对异步执行的支持。在默认情况下,该属性值为False

3. ASP.NET MVC真正用于Action方法同步和异步执行的ActionInvoker分别是ControllerActionInvoker和AsyncControllerActionInvoker。我们所有要了解的是在默认情况下(没有对Controller类型的ActionInvoker属性进行显式设置)采用的ActionInvoker类型是哪个。ASP.NET MVC对Conroller采用的ActionInvoker类型的选择机制是这样的:

通过当前的DependencyResolver以IAsyncActionInvoker接口去获取注册的ActionInvoker,如果返回对象不为Null,则将其作为默认的ActionInvoker。·

通过当前的DependencyResolver以IActionInvoker接口去获取注册的ActionInvoker,如果返回对象不为Null,则将其作为默认的ActionInvoker。

创建AsyncControllerActionInvoker对象作为默认的ActionInvoker。

如果采用ControllerActionInvoker,Action总是以同步的方式来直接,但是当AsyncControllerActionInvoker作为Controller的ActionInvoker时,并不意味着总是以异步的方式来执行所有的Action。至于这两种类型的ActionInvoker具体采用对Action的怎样的执行方式,又涉及到两个描述对象,即用于描述Controller和Action的ControllerDescriptor和ActionDescriptor。

4.ASP.NET MVC应用编程接口中具有两个具体的ControllerDescriptor,即ReflectedControllerDescriptor和ReflectedAsyncControllerDescriptor,它们分别代表同步和异步版本的ControllerDescriptor。 它们并非对分别实现了IController和IAyncController接口的Controller的描述,而是对直接继承自抽象类Controller和AsyncController的Controller的描述。它们之间的区别在于创建者的不同,在默认情况下ReflectedControllerDescriptor和ReflectedAsyncControllerDescriptor分别是通过ControllerActionInvoker和AsyncControllerActionInvoker来创建的

5.异步Action方法都只能定义在继承自AsyncController的Controller类型中,否则将被认为是同步方法。此外,由于通过ControllerActionInvoker只能创建包含ReflectedActionDescriptor的ReflectedControllerDescriptor,如果我们在AsyncController中采用ControllerActionInvoker对象作为ActionInvoker,所有的Action方法也将被认为是同步的。 

 

Action方法的执行目标Action方法的最终执行由被激活的Controller的ActionInvoker决定,ActionInvoker最终通过调用对应的ActionDescriptor来执行被它描述的Action方法。如果采用ControllerActionInvoker,被它创建的ControllerDescriptor(ReflectedControllerDescriptor)只包含同步的ActionDescriptor(ReflectedActionDescriptor),所以Action方法总是以同步的方式被执行。如果目标Controller是抽象类Controller的直接继承者,这也是通过Visual Studio的Controller创建向导的默认定义方式,ActionInvoker(ControllerActionInvoker/AsyncControllerActionInvoker)的选择只决定了创建的ControllerDescriptor的类型(ReflectedControllerDescriptor/ReflectedAsyncControllerDescriptor),ControllerDescriptor包含的所有ActionDescriptor依然是同步的(ReflectedActionDescriptor),所以Action方法也总是以同步的方式被执行。以异步方式定义的Action方法(XxxAsync/XxxCompleted或采用Task返回类型)只有定义在继承自AsyncController的Controller类型中,并且采用AsyncControllerActionInvoker作为其ActionInvoker,最终才会创建AsyncActionDescriptor来描述该Action。也只有同时满足这两个条件,Action方法才能以异步的方式执行。

转载于:https://www.cnblogs.com/xiaosuo/archive/2012/11/12/2766469.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux搭建spark集群,详解Spark+Zookeeper搭建高可用Spark集群

Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎;现在形成一个高速发展应用广泛的生态系统。Spark三种分布式部署方式比较目前Apache Spark支持三种分布式部署方式,分别是standalone、spark on mesos和 spark on YARN,详情参考。…

wifiwan口速率什么意思_无线路由器怎么设置wan口速率

wan口速率是设置无线路由器的wan口以什么速率方式工作,此设置不当会导致网速降低,下面是学习啦小编整理的无线路由器设置wan口速率的方法,供您参考。无线路由器设置wan口速率的方法在Wan口的设置中,当我们完成了基本的设置后&…

linux perl telnet安装,51CTO博客-专业IT技术博客创作平台-技术成就梦想

Telnet是一个古老而又不安全的协议,用来实现远程登录。这种服务可以和基于客户机/服务器进行通信,也就是说把你的电脑虚拟成一个键盘(伪终端)来和远程的服务进行通信,而服务器以为输入来自它本地的键盘,我们在本地所执行的命令会发…

hdu4473

这题的结果[f(1)f(2)...f(n)]其实就等价于x*y*z<n的解的个数&#xff0c;然后的方法几乎就是暴力枚举了。现场比赛的时候没想到这一点&#xff0c;太杯具了&#xff0c;浪费了两个小时的思考时间。其实我们的做法应该是可行的&#xff0c;因为f(n)具有积性性质&#xff0c;也…

https无法访问 宝塔_宝塔面板快速开启ssl(https)的方法

宝塔面板可以说在国内服务器配置方面是比较出名的&#xff0c;一些大的网站的服务器都是使用的宝塔面板&#xff0c;另外本博客作品的演示站点也是使用的宝塔面板。宝塔面板的操作与配置服务器环境对一些初入做站的将要跳坑的小白来说&#xff0c;就一件超越仙器的神器&#xf…

linux可以不用grub吗,既然不用Win了,那么GrubDOS也不用了。linux grub求指导

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼5、安装Grub到U盘上&#xff1a;[starlocalhost ~]$ sudo grub-install--root-directory/media/test/ /dev/sdbProbingdevices to guess BIOS drives. This may take a long time.Installationfinished. No error reported.This is…

raid 物理盘缓存状态_查看RAID状态

以下是组建服务器raid时查到的资料&#xff0c;做下笔记&#xff0c;没兴趣的朋友请无视。Linux下查看软、硬raid信息的方法。软件raid&#xff1a;只能通过Linux系统本身来查看cat /proc/mdstat可以看到raid级别&#xff0c;状态等信息。硬件raid&#xff1a; 最佳的办法是通过…

略读《大教堂与市集》

《大教堂与市集》&#xff08;The Cathedral and the Bazaar: Musings on Linux and Open Source by an Accidental Revolutionary&#xff09;一书中提到了软工工程的两种开发模式&#xff0c;即大教堂模式和市集模式。作者认为“Given enough eyeballs, all bugs are shallow…

c语言time函数的作用,c语言中time函数的用法

c语言中time函数的用法的用法你知道吗&#xff1f;下面小编就跟你们详细介绍下c语言中time函数的用法的用法&#xff0c;希望对你们有用。c语言中time函数的用法的用法如下&#xff1a;头文件time.h函数名称: localtime函数原型: struct tm *localtime(const time_t *t…

测试nb信号的软件_NB-IOT的OTA测试(功率、灵敏度测试)

2017年7月25日新益技术实现了NB-IoT终端系统测试&#xff0c;在OTA暗室中完成了NB-IoT终端系统总辐射功率TRP(TotalRadiated Power)和总全向灵敏度TIS(Total Isotropic Sensitivity)测试。测试得到的360度全方位辐射和接收性能参数&#xff0c;为NB-IoT产品推向市场提供重要的参…

待研究

D3D中的Alpha颜色混合 &#xff08;http://www.cnblogs.com/flying_bat/archive/2007/09/20/900558.html&#xff09;转载于:https://www.cnblogs.com/chunyou128/archive/2012/11/14/2769334.html

linux内核多队列,Linux Kernel 中 Workqueue 使用系统默认队列和创建队列的方法

关于workqueue&#xff0c;我们还是有很多话要说。想必大家对workqueue相关的函数(schedule_work 、queue_work、INIT_WORK、create_singlethread_workqueue 等)都不陌生。但说起差异&#xff0c;可能还有许多话需要坐下来慢慢讲。对于workqueue&#xff0c;与之最为相关的两个…

linux扩容根目录空间_Linux系统扩容根目录磁盘空间的操作方法

Linux系统扩容根目录磁盘空间的操作方法一、使用背景Linux根目录磁盘空间不够用了&#xff0c;当修改了虚拟机模版增加磁盘大小或者插入了一块新硬盘&#xff0c;但是发现系统里的大小还是没改变。产生的原因是没有给磁盘格式化&#xff0c;没有增加分区。二、操作方法1.查看磁…

【ASP】文件上传

描述&#xff1a;在button事件中注册一个上传事件 代码详解&#xff1a; protected void FileUpload_Click(object sender, EventArgs e) { bool fileIsvaild false; //初始化一个bool型为false的fileIsvaild if (this.FileUpload1.HasFile)…