Sök…


Använda BackgroundWorker

Utför en uppgift med bakgrundsarbetaren.

Dubbelklicka på BackgroundWorker kontrollen från verktygslådan

BackroundWorker-kontroll i verktygslådan

Så här ser BackgroundWorker ut efter att du har lagt till den.

ange bildbeskrivning här

Dubbelklicka på den tillagda kontrollen för att få händelsen BackgroundWorker1_DoWork och lägga till koden som ska köras när BackgroundWorker anropas. Något som det här:

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

Att ringa BackgroundWorker för att utföra uppgiften kan göras vid alla händelser som Button_Click , Textbox_TextChanged , etc. enligt följande:

BackgroundWorker1.RunWorkerAsync()

Ändra RunWorkerCompleted händelsen för att fånga uppdragets färdiga händelse för BackgroundWorker enligt följande:

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

Detta visar en meddelanderuta som säger Done när arbetaren slutför uppgiften som tilldelats den.

Få åtkomst till GUI-komponenter i BackgroundWorker

Du kan inte få åtkomst till några GUI-komponenter från BackgroudWorker. Till exempel om du försöker göra något liknande

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

får du ett runtime-fel som säger att "Cross-thread operation not valid: Control 'TextBox1' nås från en annan tråd än den tråd som den skapades på."

Detta beror på att BackgroundWorker kör din kod på en annan tråd parallellt med huvudtråden, och GUI-komponenterna är inte trådsäkra. Du måste ställa in din kod som ska köras på huvudtråden med hjälp av Invoke metoden, vilket ger den en delegat:

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

Eller så kan du använda ReportProgress-metoden för 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow