Visual Basic .NET Language
Background
Sök…
Använda BackgroundWorker
Utför en uppgift med bakgrundsarbetaren.
Dubbelklicka på BackgroundWorker
kontrollen från verktygslådan
Så här ser BackgroundWorker ut efter att du har lagt till den.
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