/// <summary> /// Invoke an action of a specific controller /// </summary> /// <param name="controller">The controller</param> /// <param name="actionName">The name of the action to execute</param> /// <param name="asyncMode">Indicates wheter the action should be executed in a asynchronous mode or not</param> /// <returns>The result of the action. Null is returned for asynchronous actions</returns> private IActionResult InvokeActionMethod(IController controller, string actionName, bool asyncMode, ActionParameters parameters) { //If the action should be executed asynchronously if (asyncMode && !this.BgAsyncMethods.IsBusy) { //building parameter parameters.Add("controller", controller); parameters.Add("actionName", actionName); BgAsyncMethods.RunWorkerAsync(parameters); return(null); } return(new ActionInvoker().Invoke(controller, actionName, parameters)); }
/// <summary> /// Execute asynchronous actions. It's executed in a different thread /// </summary> /// <param name="sender">The sender object</param> /// <param name="e">Event's arguments</param> void BgAsyncMethods_DoWork(object sender, DoWorkEventArgs e) { object[] parameters = null; IController controller = null; string actionName = null; object[] results = null; IActionResult actionResult = null; Exception exception = null; try { BgAsyncMethods.ReportProgress(1); //Getting arguments parameters = e.Argument as object[]; //Retrieving controller and action to invoke controller = parameters[0] as IController; actionName = parameters[1] as string; //Building de result object results = new object[] { actionResult, controller, exception /*exception*/ }; //Executing action actionResult = (IActionResult)controller.GetType().GetMethod(actionName).Invoke(controller, null); //Storing the result object for the next step results[0] = actionResult; e.Result = results; } catch (Exception ex) { //Init the result object results[2] = ex.InnerException; /* The innerException is used because the Invoke method of a MethodInfo throws a System.TargetInvocationException*/ e.Result = results; } }