在 BackgroundWorker 中訪問 GUI 元件

你無法從 BackgroudWorker 訪問任何 GUI 元件。例如,如果你嘗試做這樣的事情

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    TextBox1.Text = "Done"
End Sub

你將收到一個執行時錯誤,指出“跨執行緒操作無效:控制’TextBox1’從其建立的執行緒以外的執行緒訪問。”

這是因為 BackgroundWorker 在與主執行緒並行的另一個執行緒上執行你的程式碼,並且 GUI 元件不是執行緒安全的。你必須使用 Invoke 方法將程式碼設定為在主執行緒上執行,併為其指定代理:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub

或者你可以使用 BackgroundWorker 的 ReportProgress 方法:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    Me.BackgroundWorker1.ReportProgress(0, "Done")
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
    Me.TextBox1.Text = DirectCast(e.UserState, String)
End Sub