// for NET_1_0 and NET_1_1 no (public) ExecutionContext exists // so we must use the System.Threading.CompressedStack class internal static void ExecuteClientMessage(GCHandle gchandle) { AsyncMethodData data = (AsyncMethodData)gchandle.Target; CompressedStack original = null; #if !MWF_ON_MSRUNTIME // Stack is non-null only if the security manager is active if (data.Stack != null) { original = Thread.CurrentThread.GetCompressedStack(); Thread.CurrentThread.SetCompressedStack(data.Stack); } #endif AsyncMethodResult result = data.Result; object ret; try { ret = data.Method.DynamicInvoke(data.Args); result.Complete(ret); } catch (Exception ex) { result.CompleteWithException(ex); return; } finally { #if !MWF_ON_MSRUNTIME if (data.Stack != null) { // whatever occurs we must revert to the original compressed // stack (null being a valid, empty, value in this case). Thread.CurrentThread.SetCompressedStack(original); } #endif gchandle.Free(); } }
internal static void ExecutionCallback(object state) { AsyncMethodData data = (AsyncMethodData)state; AsyncMethodResult result = data.Result; object ret; try { ret = data.Method.DynamicInvoke(data.Args); } catch (Exception ex) { if (result != null) { result.CompleteWithException(ex); return; } throw; } if (result != null) { result.Complete(ret); } }
internal override IntPtr SendMessage (IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam) { Hwnd h; h = Hwnd.ObjectFromHandle(hwnd); if (h != null && h.queue != ThreadQueue (Thread.CurrentThread)) { AsyncMethodResult result; AsyncMethodData data; result = new AsyncMethodResult (); data = new AsyncMethodData (); data.Handle = hwnd; data.Method = new WndProcDelegate (NativeWindow.WndProc); data.Args = new object[] { hwnd, message, wParam, lParam }; data.Result = result; SendAsyncMethod (data); DriverDebug("Sending {0} message across.", message); return IntPtr.Zero; } string key = hwnd + ":" + message; if (messageHold[key] != null) messageHold[key] = ((int)messageHold[key]) - 1; return NativeWindow.WndProc(hwnd, message, wParam, lParam); }
public IntPtr SendMessage (IntPtr handle, Msg message, IntPtr wParam, IntPtr lParam) { X11Hwnd hwnd = (X11Hwnd)Hwnd.ObjectFromHandle(handle); if (hwnd == null) return IntPtr.Zero; if (hwnd.Queue.Thread != Thread.CurrentThread) { AsyncMethodResult result; AsyncMethodData data; result = new AsyncMethodResult (); data = new AsyncMethodData (); data.Handle = hwnd.Handle; data.Method = new WndProcDelegate (NativeWindow.WndProc); data.Args = new object[] { hwnd.Handle, message, wParam, lParam }; data.Result = result; SendAsyncMethod (data); #if DriverDebug || DriverDebugThreads Console.WriteLine ("Sending {0} message across.", message); #endif return IntPtr.Zero; } else { return NativeWindow.WndProc (hwnd.Handle, message, wParam, lParam); } }
internal IAsyncResult BeginInvokeInternal (Delegate method, object [] args, Control control) { AsyncMethodResult result; AsyncMethodData data; result = new AsyncMethodResult (); data = new AsyncMethodData (); data.Handle = control.GetInvokableHandle (); data.Method = method; data.Args = args; data.Result = result; if (!ExecutionContext.IsFlowSuppressed ()) { data.Context = ExecutionContext.Capture (); } XplatUI.SendAsyncMethod (data); return result; }
internal IAsyncResult BeginInvokeInternal (Delegate method, object [] args, Control control) { AsyncMethodResult result; AsyncMethodData data; result = new AsyncMethodResult (); data = new AsyncMethodData (); data.Handle = control.GetInvokableHandle (); data.Method = method; data.Args = args; data.Result = result; #if NET_2_0 if (!ExecutionContext.IsFlowSuppressed ()) { data.Context = ExecutionContext.Capture (); } #else #if !MWF_ON_MSRUNTIME if (SecurityManager.SecurityEnabled) { data.Stack = CompressedStack.GetCompressedStack (); } #endif #endif XplatUI.SendAsyncMethod (data); return result; }