/// <summary> /// Method which calls the function /// </summary> /// <param name="data">Array containing MethodInfo, OnDoneCallback, functionParameters Array, functionOwner reference</param> private static void CallFunction(object data) { object[] dataParams = (object[])data; MethodInfo funcToCall = (MethodInfo)dataParams[0]; OnDoneCallback onDoneCallback = (OnDoneCallback)dataParams[1]; object[] functionParams = (object[])dataParams[2]; object funcOwner = dataParams[3]; object result = funcToCall.Invoke(funcToCall.IsStatic ? null : funcOwner, functionParams); if (onDoneCallback != null) { onDoneCallback(result); } }
/// <summary> /// Executes a perticular function in it's own thread and calls after completion the onDoneCallback with the return value as parameter /// </summary> /// <param name="functionToCall">The function you like to call.</param> /// <param name="functionOwner">null if it is a static function. Otherwise refrence to instance of the object owning the function.</param> /// <param name="onDoneCallback">Callback which gets executed once the work in the functionToCall is done.</param> /// <param name="functionParameters">Parameters needed for the functionToCall.</param> public static void ExecuteFunction(Delegate functionToCall, object functionOwner, OnDoneCallback onDoneCallback, params object[] functionParameters) { if (AreParametersCorrect(functionToCall.Method, functionParameters) && functionToCall != null) { Thread funcThread = new Thread(new ParameterizedThreadStart(CallFunction)) { IsBackground = true }; m_ThreadStack.Push(new ThreadContainer() { Thread = funcThread, Params = new object[] { functionToCall.Method, onDoneCallback, functionParameters, functionOwner } }); } }