简单的答案是: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.
然后,如果syncSameThreadistrue它调用 in InvokeMarshaledCallbackswhich 在当前线程中执行当前控件的任务队列中的所有任务(这里是marshaler)。