Visual Basic .NET Language
BackgroundWorker
Szukaj…
Korzystanie z BackgroundWorker
Wykonywanie zadania z pracownikiem działającym w tle.
Kliknij dwukrotnie kontrolkę BackgroundWorker
z Zestawu narzędzi
Tak wygląda BackgroundWorker po dodaniu go.
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