Vue d'ensemble du composant BackgroundWorker

De nombreuses opérations couramment exécutées peuvent être longues à s'éxécuter. Par exemple :

  • Téléchargements d'images

  • Appels de service web

  • Téléchargements et chargements de fichiers (y compris pour les applications d'égal à égal)

  • Calculs locaux complexes

  • Transactions de base de données

  • Accès au disque local, compte tenu de sa vitesse lente par rapport à l'accès mémoire

Les opérations de ce type peuvent entraîner le blocage de votre interface utilisateur pendant qu’elles sont en cours d’exécution. Quand vous souhaitez une interface utilisateur réactive et que vous êtes confronté à de longs délais associés à ce type d'opérations, le composant BackgroundWorker fournit une solution commode.

Le composant BackgroundWorker vous donne la possibilité d'exécuter les opérations longues de façon asynchrone (« en arrière-plan »), sur un thread différent du thread d'interface utilisateur principal de votre application. Pour utiliser un BackgroundWorker, vous lui indiquez simplement quelle méthode de travail de longue durée exécuter en arrière-plan, puis vous appelez la méthode RunWorkerAsync. Votre thread d'appel continue de s'exécuter normalement pendant que la méthode de travail s'exécute de façon asynchrone. Une fois la méthode exécutée, le BackgroundWorker alerte le thread d'appel en déclenchant l'événement RunWorkerCompleted, lequel contient éventuellement les résultats de l'opération.

Le BackgroundWorker composant est disponible à partir de la boîte à outils, sous l’onglet composants . Pour ajouter un BackgroundWorker élément à votre formulaire, faites-le glisser BackgroundWorker sur votre formulaire. Il apparaît dans la barre d’état des composants et ses propriétés s’affichent dans la fenêtre Propriétés .

Pour démarrer votre opération asynchrone, utilisez la méthode RunWorkerAsync. RunWorkerAsync prend un paramètre object facultatif qui peut être utilisé pour passer des arguments à votre méthode de travail. La classe BackgroundWorker expose l'évenement DoWork auquel votre thread de travail est attaché via le gestionnaire d'événements DoWork.

Le gestionnaire d'événements DoWork prend un paramètre DoWorkEventArgs qui est doté de la propriété Argument. Celle-ci reçoit le paramètre de RunWorkerAsync et peut être passée à votre méthode de travail qui sera appelée dans le gestionnaire d'événements DoWork. L'exemple suivant montre comment affecter un résultat depuis une méthode de travail appelée ComputeFibonacci. Il fait partie d’un exemple plus complet, que vous pouvez trouver dans Comment : implémenter un formulaire qui utilise une opération d’arrière-plan.

// This event handler is where the actual,
// potentially time-consuming work is done.
void backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
   // Get the BackgroundWorker that raised this event.
   BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);

   // Assign the result of the computation
   // to the Result property of the DoWorkEventArgs
   // object. This is will be available to the 
   // RunWorkerCompleted eventhandler.
   e->Result = ComputeFibonacci( safe_cast<Int32>(e->Argument), worker, e );
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender,
    DoWorkEventArgs e)
{
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = sender as BackgroundWorker;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the
    // RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
' This event handler is where the actual work is done.
Private Sub backgroundWorker1_DoWork( _
ByVal sender As Object, _
ByVal e As DoWorkEventArgs) _
Handles backgroundWorker1.DoWork

    ' Get the BackgroundWorker object that raised this event.
    Dim worker As BackgroundWorker = _
        CType(sender, BackgroundWorker)

    ' Assign the result of the computation
    ' to the Result property of the DoWorkEventArgs
    ' object. This is will be available to the 
    ' RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci(e.Argument, worker, e)
End Sub

Pour plus d’informations sur l’utilisation des gestionnaires d’événements, consultez événements.

Attention

Quand vous utilisez le multithreading, vous vous exposez potentiellement à des bogues très sérieux et complexes. Consultez les Meilleures pratiques pour le threading managé avant d’implémenter une solution qui utilise le multithreading.

Pour plus d’informations sur l’utilisation de la BackgroundWorker classe, consultez Comment : exécuter une opération en arrière-plan.

Voir aussi