Visual Basic .NET Language
BackgroundWorker
Zoeken…
BackgroundWorker gebruiken
Een taak uitvoeren met de achtergrondwerker.
Dubbelklik op het besturingselement BackgroundWorker
in de Toolbox
Dit is hoe de BackgroundWorker verschijnt na het toevoegen.
Dubbelklik op het toegevoegde besturingselement om de gebeurtenis BackgroundWorker1_DoWork
te halen en de code toe te voegen die moet worden uitgevoerd wanneer de BackgroundWorker wordt aangeroepen. Iets zoals dit:
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
De BackgroundWorker aanroepen om de taak uit te voeren, kan als volgt worden gedaan bij elk evenement zoals Button_Click
, Textbox_TextChanged
, etc.:
BackgroundWorker1.RunWorkerAsync()
Wijzig de RunWorkerCompleted
gebeurtenis om de taak-voltooide gebeurtenis van de BackgroundWorker vast te leggen als volgt:
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MsgBox("Done")
End Sub
Dit geeft een berichtvenster weer met de tekst Done
wanneer de medewerker de toegewezen taak heeft voltooid.
Toegang tot GUI-componenten in BackgroundWorker
U hebt geen toegang tot GUI-componenten vanuit BackgroudWorker. Bijvoorbeeld als je zoiets probeert te doen
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
TextBox1.Text = "Done"
End Sub
ontvangt u een runtime-fout die zegt dat "Cross-thread-bewerking niet geldig: controle 'TextBox1' toegankelijk vanuit een andere thread dan de thread waarop het is gemaakt."
Dit komt omdat de BackgroundWorker uw code op een andere thread parallel aan de hoofdthread uitvoert en de GUI-componenten niet thread-safe zijn. U moet uw code instellen om op de Invoke
te worden uitgevoerd met behulp van de Invoke
methode, zodat deze een gemachtigde krijgt:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub
Of u kunt de ReportProgress-methode van de BackgroundWorker gebruiken:
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