使用 Control.Invoke() 执行线程安全的调用

使用 Control.Invoke() 方法,你可以将方法或函数的执行从后台线程移动到创建控件的线程,该线程通常是 UI(用户界面)线程。通过这样做,你的代码将排队等待在控件的线程上运行,这消除了并发的可能性。

还应检查 Control.InvokeRequired 属性,以确定是否需要调用,或者代码是否已在与控件相同的线程上运行。

Invoke() 方法将委托作为其第一个参数。委托将引用,参数列表和返回类型保存到另一个方法。

在 Visual Basic 2010(10.0) 或更高版本中, lambda 表达式可用于动态创建委托方法:

If LogTextBox.InvokeRequired = True Then
    LogTextBox.Invoke(Sub() LogTextBox.AppendText("Check passed"))
Else
    LogTextBox.AppendText("Check passed")
End If

而在 Visual Basic 2008(9.0) 或更低版本中,你必须自己声明委托:

Delegate Sub AddLogText(ByVal Text As String)

If LogTextBox.InvokeRequired = True Then
    LogTextBox.Invoke(New AddLogText(AddressOf UpdateLog), "Check passed")
Else
    UpdateLog("Check passed")
End If

Sub UpdateLog(ByVal Text As String)
    LogTextBox.AppendText(Text)
End Sub