Szukaj…


Korzystanie z BackgroundWorker

Wykonywanie zadania z pracownikiem działającym w tle.

Kliknij dwukrotnie kontrolkę BackgroundWorker z Zestawu narzędzi

BackroundWorker Control in Toolbox

Tak wygląda BackgroundWorker po dodaniu go.

wprowadź opis zdjęcia tutaj

Kliknij dwukrotnie dodaną kontrolkę, aby uzyskać zdarzenie BackgroundWorker1_DoWork i dodaj kod, który ma zostać wykonany po wywołaniu BackgroundWorker. Coś takiego:

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

Wywołanie BackgroundWorker w celu wykonania zadania można wykonać w dowolnym przypadku, takim jak Button_Click , Textbox_TextChanged itp. W następujący sposób:

BackgroundWorker1.RunWorkerAsync()

Zmodyfikuj zdarzenie RunWorkerCompleted , aby przechwycić zdarzenie ukończone zadania BackgroundWorker w następujący sposób:

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    MsgBox("Done")
End Sub

Spowoduje to wyświetlenie okna komunikatu z komunikatem Done gdy pracownik zakończy przypisane mu zadanie.

Dostęp do komponentów GUI w BackgroundWorker

Nie możesz uzyskać dostępu do żadnych składników GUI z BackgroudWorker. Na przykład, jeśli spróbujesz zrobić coś takiego

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

pojawi się błąd środowiska wykonawczego informujący, że „Nieprawidłowa operacja między wątkami: kontrola„ TextBox1 ”jest dostępna z wątku innego niż wątek, w którym został utworzony.”

Wynika to z faktu, że BackgroundWorker uruchamia kod w innym wątku równolegle z głównym wątkiem, a komponenty GUI nie są bezpieczne dla wątków. Musisz ustawić kod, aby był uruchamiany w głównym wątku za pomocą metody Invoke , co daje mu delegata:

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

Lub możesz użyć metody ReportProgress BackgroundWorker:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow