ASP.NET mvc 4 Controllder同期か非同期か

8652 ワード

抽象クラスControllerの定義から,IAsyncController,IControllerを同時に実現していることがわかる.
   public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
    {
        protected Controller();
    }

IAsyncControllerは非同期を表します.
属性DisableAsyncSupport属性により、DisableAsyncSupport=trueが同期DisableAsyncSupport=falseが非同期であるかどうかを判断します.
しかし、BeginExecute/EndExecuteメソッドを実行しても、Controllerは必ずしも非同期ではなく、次のようなコードクリップを実行します.
 
public class HomeController : Controller
    {
        protected override bool DisableAsyncSupport
        {
            get { return false; }
        }

        public new HttpResponse Response
        {
            get { return System.Web.HttpContext.Current.Response; }
        }

        /// <summary>
        ///     
        /// </summary>
        /// <param name="requestContext"></param>
        protected override void Execute(RequestContext requestContext)
        {
            Response.Write("Execute(); <br/>");
            base.Execute(requestContext);
        }

        /// <summary>
        ///     
        /// </summary>
        protected override void ExecuteCore()
        {
            Response.Write("ExecuteCore(); <br/>");
            base.ExecuteCore();
        }

        /// <summary>
        ///         
        /// </summary> 
        protected override IAsyncResult BeginExecute(RequestContext requestContext,
            AsyncCallback callback, object state)
        {
            Response.Write("BeginExecute(); <br/>");
            return base.BeginExecute(requestContext, callback, state);
        }

        /// <summary>
        ///         
        /// </summary>
        /// <param name="asyncResult"></param>
        protected override void EndExecute(IAsyncResult asyncResult)
        {
            Response.Write("EndExecute(); <br/>");
            base.EndExecute(asyncResult);
        }

        /// <summary>
        ///     
        /// </summary>  
        protected override IAsyncResult BeginExecuteCore(AsyncCallback callback,
            object state)
        {
            Response.Write("BeginExecuteCore(); <br/>");
            return base.BeginExecuteCore(callback, state);
        }

        /// <summary>
        ///     
        /// </summary>
        /// <param name="asyncResult"></param>
        protected override void EndExecuteCore(IAsyncResult asyncResult)
        {
            Response.Write("EndExecuteCore(); <br/>");
            base.EndExecuteCore(asyncResult);
        }

        public ActionResult Index()
        {
            return Content("Index();<br/>");
        }
    }

 
Controllerはまた、Controllerが非同期であるかどうかではなく、Actionメソッドが非同期で実行されるかどうかを指すIAsyncControllerインタフェースを継承し、MVC 4以前にActionの非同期は
XxxAsync/XxxCompleted形式定義非同期Actionを定義し、新バージョンでは旧バージョンに対応するためIAsyncControllerを参照
4.0以降、Actionは、Taskを返すことによって、Actionを非同期で実行するか否かを定義する.