Visual Basic .NET Language
BackgroundWorker
Suche…
BackgroundWorker verwenden
Ausführen einer Aufgabe mit dem Hintergrundarbeiter
Doppelklicken Sie in der Toolbox auf das BackgroundWorker
Steuerelement
So erscheint der BackgroundWorker, nachdem er hinzugefügt wurde.
Doppelklicken Sie auf das hinzugefügte Steuerelement, um das BackgroundWorker1_DoWork
Ereignis zu erhalten, und fügen Sie den Code hinzu, der ausgeführt werden soll, wenn der BackgroundWorker aufgerufen wird. Etwas wie das:
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'Do the time consuming background task here
End Sub
Das Aufrufen des BackgroundWorker zum Ausführen der Aufgabe kann bei jedem Ereignis wie Button_Click
, Textbox_TextChanged
usw. wie folgt durchgeführt werden:
BackgroundWorker1.RunWorkerAsync()
RunWorkerCompleted
Ereignis " RunWorkerCompleted
, um das Ereignis "Vorgang abgeschlossen" des BackgroundWorker wie folgt zu erfassen:
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MsgBox("Done")
End Sub
Daraufhin wird ein Meldungsfeld mit der Meldung Done
angezeigt, wenn der Mitarbeiter die ihm zugewiesene Aufgabe abgeschlossen hat.
Zugriff auf GUI-Komponenten in BackgroundWorker
Sie können vom BackgroudWorker aus nicht auf GUI-Komponenten zugreifen. Zum Beispiel, wenn Sie versuchen, so etwas zu tun
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
TextBox1.Text = "Done"
End Sub
Sie erhalten einen Laufzeitfehler, der besagt, dass "Cross-Thread-Vorgang nicht gültig ist: Auf das Steuerelement" TextBox1 "wurde von einem anderen Thread als dem Thread zugegriffen, für den es erstellt wurde.
Dies liegt daran, dass der BackgroundWorker Ihren Code in einem anderen Thread parallel zum Hauptthread ausführt und die GUI-Komponenten nicht threadsicher sind. Sie müssen Ihren Code so einstellen, dass er im Hauptthread mithilfe der Invoke
Methode ausgeführt wird, und ihm einen Delegaten Invoke
:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub
Oder Sie können die ReportProgress-Methode des BackgroundWorker verwenden:
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