ASP.NET mvc 4 Controllder同期か非同期か
8652 ワード
抽象クラスControllerの定義から,IAsyncController,IControllerを同時に実現していることがわかる.
IAsyncControllerは非同期を表します.
属性DisableAsyncSupport属性により、DisableAsyncSupport=trueが同期DisableAsyncSupport=falseが非同期であるかどうかを判断します.
しかし、BeginExecute/EndExecuteメソッドを実行しても、Controllerは必ずしも非同期ではなく、次のようなコードクリップを実行します.
Controllerはまた、Controllerが非同期であるかどうかではなく、Actionメソッドが非同期で実行されるかどうかを指すIAsyncControllerインタフェースを継承し、MVC 4以前にActionの非同期は
XxxAsync/XxxCompleted形式定義非同期Actionを定義し、新バージョンでは旧バージョンに対応するためIAsyncControllerを参照
4.0以降、Actionは、Taskを返すことによって、Actionを非同期で実行するか否かを定義する.
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を非同期で実行するか否かを定義する.