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。
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
總結
以上是生活随笔為你收集整理的ASP.NET MVC中同步与异步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python-Telnet连接工具类
- 下一篇: ADO.NET的记忆碎片(七)