Exporter (0) Imprimer
Développer tout
Cet article a fait l'objet d'une traduction automatique. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
Traduction
Source

Control.Invoke, méthode (Delegate)

Exécute le délégué spécifié sur le thread qui détient le handle de fenêtre sous-jacent du contrôle.

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

public Object Invoke(
	Delegate method
)

Paramètres

method
Type : System.Delegate
Délégué qui contient une méthode à appeler dans le contexte du thread du contrôle.

Valeur de retour

Type : System.Object
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 des langages 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és.

La méthode Invoke effectuera la recherche dans la chaîne parente du contrôle jusqu'à ce qu'elle trouve un contrôle ou un formulaire avec un handle de fenêtre si le handle de fenêtre du contrôle sous-jacent actuel n'existe pas encore. Si aucun handle approprié n'est trouvé, la méthode Invoke lèvera une exception. Les exceptions déclenchées au cours de l'appel seront propagées vers l'appelant.

RemarqueRemarque

Outre la propriété InvokeRequired, 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 de CreateGraphics avant la création du handle du contrôle sur un thread d'arrière-plan peut entraîner des appels inter-threads illégaux. Pour tous les autres appels de méthode, vous devez utiliser l'une des méthodes Invoke pour marshaler l'appel au 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 à un délégué EventHandler ou MethodInvoker sera plus rapide qu'un appel à un autre type de délégué.

RemarqueRemarque

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

L'exemple de code suivant affiche des 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 possède le handle sous-jacent du formulaire. Lorsque l'utilisateur clique sur le bouton, Invoke exécute le délégué.


/*
The following example demonstrates the 'Invoke(Delegate)' method of 'Control class.
A 'ListBox' and a 'Button' control are added to a form, containing a delegate
which encapsulates a method that adds items to the listbox.This function is executed
on the thread that owns the underlying handle of the form. When user clicks on button
the above delegate is executed using 'Invoke' method.


*/

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

   public class MyFormControl : Form
   {
      public delegate void AddListItem();
      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 myItem;
         for(int i=1;i<6;i++)
         {
            myItem = "MyListItem" + i.ToString();
            myListBox.Items.Add(myItem);
            myListBox.Update();
            Thread.Sleep(300);
         }
      }
      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();
      }
   }

// The following code assumes a 'ListBox' and a 'Button' control are added to a form, 
// containing a delegate which encapsulates a method that adds items to the listbox.

   public class MyThreadClass
   {
      MyFormControl myFormControl1;
      public MyThreadClass(MyFormControl myForm)
      {
         myFormControl1 = myForm;
      }

      public void Run()
      {
         // Execute the specified delegate on the thread that owns
         // 'myFormControl1' control's underlying window handle.
         myFormControl1.Invoke(myFormControl1.myDelegate);
      }
   }


.NET Framework

Pris en charge dans : 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (rôle principal du serveur non pris en charge), Windows Server 2008 R2 (rôle principal du serveur pris en charge avec SP1 ou version ultérieure ; Itanium non pris en charge)

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

Ajouts de la communauté

AJOUTER
Afficher:
© 2014 Microsoft