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

Contrôle BackroundWorker dans la boîte à outils

Voici comment le BackgroundWorker apparaît après l'ajout.

entrer la description de l'image ici

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow