Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés
Esta documentación está archivada y no tiene mantenimiento.

Control.Invoke (Método) (Delegate)

Ejecuta el delegado especificado en el subproceso que posee el identificador de ventana subyacente del control.

Espacio de nombres:  System.Windows.Forms
Ensamblado:  System.Windows.Forms (en System.Windows.Forms.dll)

public Object Invoke(
	Delegate method
)

Parámetros

method
Tipo: System.Delegate
Delegado que contiene un método al que se va a llamar en el contexto del subproceso del control.

Valor devuelto

Tipo: System.Object
Valor devuelto desde el delegado al que se ha invocado o null si el delegado no devuelve ningún valor.

Los delegados son similares a los punteros a funciones de los lenguajes C o C++. Los delegados encapsulan una referencia a un método dentro de un objeto delegado. El objeto delegado se puede pasar entonces a código que llame al método al que se ha hecho referencia y el método que hay que invocar puede ser desconocido en tiempo de compilación. A diferencia de los punteros a funciones de C o C++, los delegados están orientados a objetos, tienen seguridad de tipos y son más seguros.

El método Invoke busca en la cadena principal del control hasta que encuentra un control o un formulario que tiene un identificador de ventana si el identificador de ventana subyacente del control actual no existe todavía. Si no se encuentra un identificador apropiado, el método Invoke producirá una excepción. Las excepciones generadas durante la llamada se propagarán hacia el llamador.

NotaNota

Además de la propiedad InvokeRequired, en un control hay cuatro métodos que son seguros para la ejecución de subprocesos: Invoke, BeginInvoke, EndInvoke y CreateGraphics si ya se ha creado el identificador del control. La llamada a CreateGraphics antes de la creación del identificador del control en un subproceso de fondo puede producir llamadas no válidas entre subprocesos. Para el resto de las llamadas a métodos, sería conveniente utilizar uno de los métodos de invocación para calcular las referencias de la llamada al subproceso del control.

El delegado puede ser una instancia de EventHandler, en cuyo caso el parámetro remitente contendrá este control, y el parámetro de evento contendrá EventArgs.Empty. El delegado también puede ser una instancia de MethodInvoker o cualquier otro delegado que tome una lista de parámetros vacía. Una llamada a un delegado EventHandler o MethodInvoker será más rápida que una llamada a otro tipo de delegado.

NotaNota

Podría iniciarse una excepción si el subproceso que debe procesar el mensaje ya no está activo.

En el ejemplo de código siguiente se muestran controles que contienen un delegado. El delegado encapsula un método que agrega elementos al cuadro de lista y este método se ejecuta en el subproceso que posee el identificador subyacente del formulario. Cuando el usuario hace clic en el botón, Invoke ejecuta el delegado.


/*
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

Compatible con: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Windows 7, Windows Vista SP1 o posterior, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (no se admite Server Core), Windows Server 2008 R2 (se admite Server Core con SP1 o posterior), Windows Server 2003 SP2

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Mostrar: