Zoeken…


BackgroundWorker gebruiken

Een taak uitvoeren met de achtergrondwerker.

Dubbelklik op het besturingselement BackgroundWorker in de Toolbox

BackroundWorker Control in Toolbox

Dit is hoe de BackgroundWorker verschijnt na het toevoegen.

voer hier de afbeeldingsbeschrijving in

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow