使用 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