Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez aussi afficher la version anglaise dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte.
Traduction
Anglais

Comment : manipuler des contrôles à partir de threads

Le composant BackgroundWorker remplace la méthode BeginInvoke et lui ajoute des fonctionnalités ; toutefois, la méthode BeginInvoke est conservée pour la compatibilité descendante et l'utilisation future si tel est votre choix. Pour plus d'informations, consultez Vue d'ensemble du composant BackgroundWorker.

Le multithreading est la méthode la mieux adaptée aux procédures en cours d'exécution de modules de classe sollicitant beaucoup le processeur. Contrairement aux autres composants, les méthodes d'appel direct dans des contrôles à partir de threads distincts posent certains problèmes. Les méthodes affectant les contrôles ne doivent être exécutées que sur le thread sur lequel le contrôle a été créé. Le fait de marshaler des appels à partir d'un thread et de les envoyer sur des limites de thread vers un autre thread consomme beaucoup de ressources système. Vous devez donc éviter d'effectuer de façon répétée des appels de contrôles sur d'autres threads. Dans le meilleur des cas, les appels directs à partir d'autres threads affecteront les performances de votre application. Dans le pire des cas, certaines conditions peuvent provoquer un interblocage de votre application et geler l'exécution.

Néanmoins, à l'occasion, vous voudrez peut-être appeler des méthodes de contrôles à partir de vos threads. Par exemple, vous pouvez appeler une méthode désactivant un bouton ou mettant à jour un affichage d'un formulaire en réponse à une action d'un thread. Le .NET Framework offre des méthodes sûres permettant, à partir d'un thread, d'appeler des méthodes interagissant avec des contrôles appartenant à d'autres threads. L'exécution de méthodes sur des contrôles peut se faire de manière synchrone à l'aide de la méthode Invoke ou de manière asynchrone à l'aide de la méthode BeginInvoke. Pour utiliser ces méthodes, vous devez déclarer un délégué ayant la même signature que la méthode à appeler. Vous pouvez ensuite appeler la méthode Invoke ou BeginInvoke de tout contrôle du formulaire en fournissant le délégué approprié à la méthode que vous souhaitez appeler. Tous les paramètres requis sont encapsulés dans Object et transmis à la méthode.

Pour appeler des méthodes de contrôles appartenant à d'autres threads

  1. Déclarez un délégué ayant une signature identique à celle de la méthode que vous souhaitez appeler.

    L'exemple suivant montre comment déclarer un délégué avec des paramètres Integer et String.

    public delegate void myDelegate(int anInteger, string aString);
    
  2. Utilisez un contrôle pour appeler des méthodes manipulant des contrôles appartenant à d'autres threads.

    Remarque Remarque

    Les paramètres requis (le cas échéant) par la méthode peuvent être indiqués dans Object.

    • Si vous voulez appeler des méthodes de manière synchrone, appelez la méthode Control.Invoke.

      Label1.Invoke(new myDelegate(myMethod), new Object[] {1,
         "This is the string"});
      
    • Si vous voulez appeler des méthodes de manière asynchrone, appelez la méthode Control.BeginInvoke.

      Label1.BeginInvoke(new myDelegate(myMethod), new 
      Object[] {1, "This is the string"});
      
Afficher: