简单的答案是:method1 在当前线程(GUI 线程)中被调用。它非常类似于:
public void method1(Object sender, EventArgs args)
{
if(dataGridView1.InvokeRequired)
method1();
else
// Do something to dataGridView1
}
除了它还执行已在编组器控件中排队的所有先前方法。
这里有一些细节反编译Control.Invoke
。
正如 MSDN 上所解释的,Invoke
“向上搜索控件的父链,直到找到具有窗口句柄的控件或表单”。我们称之为“父”控件:marshaler
。
然后,与委托一起Invoke
调用以作为参数执行。marshaler.MarshaledInvoke
在MarshaledInvoke
中,执行的第一个操作是检查当前线程(调用的线程是否Invoke
与附加到窗口句柄的线程相同marshaler
。它将结果存储到变量syncSameThread
中。
它将新任务排入与marshaler
.
然后,如果syncSameThread
istrue
它调用 in InvokeMarshaledCallbacks
which 在当前线程中执行当前控件的任务队列中的所有任务(这里是marshaler
)。