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

示例

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

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

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

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

IfLogTextBox.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)

IfLogTextBox.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