从受影响的特定控件调用Invoke的目的是什么?

时间:2013-12-21 14:01:59

标签: vb.net invoke

假设我有以下sub,只是将传递的项添加到ListView控件:

Private Sub AddListItem(ByVal item As ListViewItem)
    UIList.Items.Add(item)
End Sub

我在BackgroundWorker线程中使用它,如下所示:

UIList.BeginInvoke(Sub() AddListItem(lvItem))

很明显,我刚刚发现似乎无关紧要哪个控件用于调用Invoke\BeginInvoke方法,或者即使我完全省略了一个控件只是直接调用方法 - 我假设在幕后使用Me.<Method> - 这似乎并不重要。代码仍然有效。

那么,使用受影响的控件来调用方法只是为了让代码更容易理解吗?其他优点是什么?当使用不同的控件时,是否需要注意某些陷阱?

1 个答案:

答案 0 :(得分:1)

使用ILSpy并挖掘Control.Invoke method,摘录为

...
UnsafeNativeMethods.PostMessage(
    new HandleRef(this, this.Handle), 
    Control.threadCallbackMessage, 
    IntPtr.Zero, 
    IntPtr.Zero);
 ...

此外,MSDN states

  

Invoke方法搜索控件的父链,直到它为止   找到一个控件或窗体,如果是当前窗口句柄   控件的底层窗口句柄尚不存在。如果不   可以找到合适的句柄,Invoke方法会抛出一个   例外。通话期间提出的例外情况将是   传播回呼叫者。

所以通常你发布哪个控件并不重要。

就个人而言,我使用“最近”的控件来调用Invoke方法。