Suche…


BackgroundWorker verwenden

Ausführen einer Aufgabe mit dem Hintergrundarbeiter

Doppelklicken Sie in der Toolbox auf das BackgroundWorker Steuerelement

BackroundWorker-Steuerelement in der Toolbox

So erscheint der BackgroundWorker, nachdem er hinzugefügt wurde.

Geben Sie hier die Bildbeschreibung ein

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow