Visual Basic .NET Language
BackgroundWorker
Recherche…
Utiliser BackgroundWorker
Exécuter une tâche avec le travailleur d'arrière-plan.
Double-cliquez sur le contrôle BackgroundWorker
partir de la boîte à outils
Voici comment le BackgroundWorker apparaît après l'ajout.
Double-cliquez sur le contrôle ajouté pour obtenir l'événement BackgroundWorker1_DoWork
et ajoutez le code à exécuter lorsque vous appelez BackgroundWorker. Quelque chose comme ça:
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
L'appel de BackgroundWorker pour effectuer la tâche peut être effectué à tout événement comme Button_Click
, Textbox_TextChanged
, etc. comme suit:
BackgroundWorker1.RunWorkerAsync()
Modifiez l'événement RunWorkerCompleted
pour capturer l'événement de tâche terminé de BackgroundWorker comme suit:
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MsgBox("Done")
End Sub
Cela affichera une boîte de message indiquant Done
lorsque le travailleur termine la tâche qui lui est assignée.
Accès aux composants de l'interface graphique dans BackgroundWorker
Vous ne pouvez pas accéder aux composants de l'interface graphique depuis BackgroudWorker. Par exemple, si vous essayez de faire quelque chose comme ça
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
TextBox1.Text = "Done"
End Sub
vous recevrez une erreur d'exécution indiquant que "l'opération cross-thread n'est pas valide: contrôlez 'TextBox1' accessible à partir d'un thread autre que celui sur lequel il a été créé."
Cela est dû au fait que BackgroundWorker exécute votre code sur un autre thread en parallèle avec le thread principal et que les composants de l'interface graphique ne sont pas compatibles avec les threads. Vous devez définir votre code à exécuter sur le thread principal à l'aide de la méthode Invoke
, en lui attribuant un délégué:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub
Ou vous pouvez utiliser la méthode ReportProgress du 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