Cet article a fait l’objet d’une traduction automatique. Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez également afficher le texte anglais dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte traduit.
Traduction
Anglais

Control.Invoke méthode (Delegate, Object[])

 

Date de publication : novembre 2016

Exécute le délégué spécifié sur le thread qui détient le handle de fenêtre sous-jacent du contrôle, avec la liste d’arguments spécifiée.

Espace de noms:   System.Windows.Forms
Assembly:  System.Windows.Forms (dans System.Windows.Forms.dll)

public object Invoke(
	Delegate method,
	params object[] args
)

Paramètres

method
Type: System.Delegate

Délégué vers une méthode qui accepte des paramètres du même nombre et du même type que ceux contenus dans le paramètre args.

args
Type: System.Object[]

Tableau d’objets à passer comme arguments à la méthode spécifiée. Ce paramètre peut être null si la méthode n'accepte aucun argument.

Valeur de retour

Type: System.Object

Object qui contient la valeur de retour du délégué appelé ou null si le délégué n'a pas de valeur de retour.

Les délégués sont semblables aux pointeurs fonction en langage C ou C++. Ils encapsulent une référence à une méthode dans un objet de délégué. L’objet délégué peut ensuite être transmis au code qui appelle la méthode référencée, et la méthode à appeler peut être inconnue au moment de la compilation. Contrairement aux pointeurs fonction en C ou C++, les délégués sont orientés objet, de type sécurisé et plus sécurisé.

Si le handle du contrôle n’existe pas encore, cette méthode recherche dans la chaîne du contrôle parent jusqu'à ce qu’il trouve un contrôle ou un formulaire avec un handle de fenêtre. Si aucun handle approprié n’est trouvé, cette méthode lève une exception. Les exceptions qui sont déclenchées lors de l’appel seront propagées vers l’appelant.

System_CAPS_noteRemarque

Outre le InvokeRequired propriété, il existe quatre méthodes sur un contrôle qui sont thread-safe : Invoke, BeginInvoke, EndInvoke, et CreateGraphics Si le handle du contrôle a déjà été créé. L’appel CreateGraphics avant que le handle du contrôle a été créé sur un thread d’arrière-plan peut entraîner des appels du thread inter illégaux. Pour tous les autres appels de méthode, vous devez utiliser une des méthodes invoke pour marshaler l’appel vers le thread du contrôle.

Le délégué peut être une instance de EventHandler, dans ce cas, le paramètre sender contiendra ce contrôle, et le paramètre event contiendra EventArgs.Empty. Le délégué peut également être une instance de MethodInvoker, ou tout autre délégué qui accepte une liste de paramètres void. Un appel à une EventHandler ou MethodInvoker délégué sera plus rapide qu’un appel à un autre type de délégué.

System_CAPS_noteRemarque

Une exception peut être levée si le thread qui doit traiter le message n’est plus actif.

L’exemple de code suivant affiche les contrôles qui contiennent un délégué. Le délégué encapsule une méthode qui ajoute des éléments à la zone de liste, et cette méthode est exécutée sur le thread qui détient le handle sous-jacent du formulaire, en utilisant les arguments spécifiés. Lorsque l’utilisateur clique sur le bouton, Invoke exécute le délégué.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

   public class MyFormControl : Form
   {
      public delegate void AddListItem(String myString);
      public AddListItem myDelegate;
      private Button myButton;
      private Thread myThread;
      private ListBox myListBox;
      public MyFormControl()
      {
         myButton = new Button();
         myListBox = new ListBox();
         myButton.Location = new Point(72, 160);
         myButton.Size = new Size(152, 32);
         myButton.TabIndex = 1;
         myButton.Text = "Add items in list box";
         myButton.Click += new EventHandler(Button_Click);
         myListBox.Location = new Point(48, 32);
         myListBox.Name = "myListBox";
         myListBox.Size = new Size(200, 95);
         myListBox.TabIndex = 2;
         ClientSize = new Size(292, 273);
         Controls.AddRange(new Control[] {myListBox,myButton});
         Text = " 'Control_Invoke' example ";
         myDelegate = new AddListItem(AddListItemMethod);
      }
      static void Main()
      {
         MyFormControl myForm = new MyFormControl();
         myForm.ShowDialog();
      }
      public void AddListItemMethod(String myString)
      {
            myListBox.Items.Add(myString);
      }
      private void Button_Click(object sender, EventArgs e)
      {
         myThread = new Thread(new ThreadStart(ThreadFunction));
         myThread.Start();
      }
      private void ThreadFunction()
      {
         MyThreadClass myThreadClassObject  = new MyThreadClass(this);
         myThreadClassObject.Run();
      }
   }
   public class MyThreadClass
   {
      MyFormControl myFormControl1;
      public MyThreadClass(MyFormControl myForm)
      {
         myFormControl1 = myForm;
      }
      String myString;

      public void Run()
      {


         for (int i = 1; i <= 5; i++)
         {
            myString = "Step number " + i.ToString() + " executed";
            Thread.Sleep(400);
            // Execute the specified delegate on the thread that owns
            // 'myFormControl1' control's underlying window handle with
            // the specified list of arguments.
            myFormControl1.Invoke(myFormControl1.myDelegate,
                                   new Object[] {myString});
         }
      }
   }

.NET Framework
Disponible depuis 1.1
Retour au début
Afficher: