none
asp.net mvc4 如何实现异步操作 RRS feed

  • 问题

  • 我的Controller结构是:

    DefaultController 继承 BaseAuthorizedController

    BaseAuthorizedController 继承 KnockoutController

    我想在 BaseAuthorizedController 的通过重写的方法实现一个日志记录功能:

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                base.OnActionExecuted(filterContext);
                Task t = new Task(() =>
                {
                    DoLog(filterContext);
                });
            }

    如何给 BaseAuthorizedController 加上异步功能,因为不允许多继承,不知道 IAsyncController 加到哪里。

    2014年1月15日 3:35

答案

  • 你好:

    默认情况下Controller实现了同步和异步两个版本:

    public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController,……

    因此你看Controller的具体实现:

    protected virtual IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state)
            {
                if (this.DisableAsyncSupport)   //如果启用异步(默认是启用的)
                {
                    return AsyncResultWrapper.BeginSynchronous(callback, state, () => this.Execute(requestContext), Controller._executeTag);
                }
                if (requestContext == null)
                {
                    throw new ArgumentNullException("requestContext");
                }
                base.VerifyExecuteCalledOnce();
                this.Initialize(requestContext);
                Controller controller = this;
                Controller controller1 = this;
                return AsyncResultWrapper.Begin(callback, state, new BeginInvokeDelegate(controller.BeginExecuteCore), new EndInvokeDelegate(controller1.EndExecuteCore), Controller._executeTag);
            }

    因此如果你的Controller直接继承于Controller,默认应该是异步而不是同步的

    此外,关于日志本身的异步,完全可以通过定义一个委托,使用其中的BeginInvoke实现即可。


    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report
    Free Tech Books Search


    2014年1月15日 6:35