Edit: The control implements the ISynchronizeInvoke interface. You can do the same effect with SynchronizationContext and call Post when invoke invocation. something like:
public object Invoke(Delegate method, object[] args) { if (method == null) { throw new ArgumentNullException("method"); } object objectToGet = null; SendOrPostCallback invoker = new SendOrPostCallback( delegate(object data) { objectToGet = method.DynamicInvoke(args); }); _currentContext.Send(new SendOrPostCallback(invoker), method.Target); return objectToGet; }
Further research using Reflector shows that Invoke uses some native API calls to achieve this:
private object MarshaledInvoke(Control caller, Delegate method, object[] args, bool synchronous) { int num; if (!this.IsHandleCreated) { throw new InvalidOperationException(SR.GetString("ErrorNoMarshalingThread")); } if (((ActiveXImpl) this.Properties.GetObject(PropActiveXImpl)) != null) { IntSecurity.UnmanagedCode.Demand(); } bool flag = false; if ((SafeNativeMethods.GetWindowThreadProcessId(new HandleRef(this, this.Handle), out num) == SafeNativeMethods.GetCurrentThreadId()) && synchronous) { flag = true; } ExecutionContext executionContext = null; if (!flag) { executionContext = ExecutionContext.Capture(); } ThreadMethodEntry entry = new ThreadMethodEntry(caller, this, method, args, synchronous, executionContext); lock (this) { if (this.threadCallbackList == null) { this.threadCallbackList = new Queue(); } } lock (this.threadCallbackList) { if (threadCallbackMessage == 0) { threadCallbackMessage = SafeNativeMethods.RegisterWindowMessage(Application.WindowMessagesVersion + "_ThreadCallbackMessage"); } this.threadCallbackList.Enqueue(entry); } if (flag) { this.InvokeMarshaledCallbacks(); } else { UnsafeNativeMethods.PostMessage(new HandleRef(this, this.Handle), threadCallbackMessage, IntPtr.Zero, IntPtr.Zero); } if (!synchronous) { return entry; } if (!entry.IsCompleted) { this.WaitForWaitHandle(entry.AsyncWaitHandle); } if (entry.exception != null) { throw entry.exception; } return entry.retVal; }
Jalal said
source share