protected virtual IAsyncResult OnBeginExecute(AsyncCallback callback, object state)
        {
            LoadTempData();

            try
            {
                string actionName = RouteData.GetRequiredValue <string>("action");

                IActionExecutor      executor      = ActionExecutor;
                IAsyncActionExecutor asyncExecutor = (executor as IAsyncActionExecutor);

                if (asyncExecutor != null)
                {
                    BeginInvokeDelegate beginDelegate = delegate(AsyncCallback asyncCallback, object asyncState) {
                        return(asyncExecutor.BeginInvokeAction(Context, actionName, asyncCallback, asyncState, new ValueDictionary()));
                    };
                    EndInvokeDelegate endDelegate = delegate(IAsyncResult asyncResult) {
                        if (!asyncExecutor.EndInvokeAction(asyncResult))
                        {
                            HandleUnknownAction(actionName);
                        }
                    };
                    return(AsyncResultWrapper.Begin(callback, state, beginDelegate, endDelegate, _tag));
                }
                else
                {
                    Action action = () => {
                        if (!executor.InvokeAction(Context, actionName, null))
                        {
                            HandleUnknownAction(actionName);
                        }
                    };
                    return(AsyncResultWrapper.BeginSynchronous(callback, state, action, _tag));
                }
            }
            catch
            {
                SaveTempData();
                throw;
            }
        }