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