在 BackgroundWorker 中訪問 GUI 元件
你無法從 BackgroudWorker 訪問任何 GUI 元件。例如,如果你嘗試做這樣的事情
placeholderCopyPrivate Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
TextBox1.Text = "Done"
End Sub
你將收到一個執行時錯誤,指出“跨執行緒操作無效:控制’TextBox1’從其建立的執行緒以外的執行緒訪問。”
這是因為 BackgroundWorker 在與主執行緒並行的另一個執行緒上執行你的程式碼,並且 GUI 元件不是執行緒安全的。你必須使用 Invoke
方法將程式碼設定為在主執行緒上執行,併為其指定代理:
placeholderCopyPrivate Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub
或者你可以使用 BackgroundWorker 的 ReportProgress 方法:
placeholderCopyPrivate 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