Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Control.Invoke-Methode: (Delegate)

 

Veröffentlicht: Oktober 2016

Führt den angegebenen Delegaten für den Thread aus, der das, dem Steuerelement zugrunde liegende, Fensterhandle besitzt.

Namespace:   System.Windows.Forms
Assembly:  System.Windows.Forms (in System.Windows.Forms.dll)

public object Invoke(
	Delegate method
)

Parameter

method
Type: System.Delegate

Ein Delegat, der eine aufzurufende Methode im Threadkontext des Steuerelements enthält.

Rückgabewert

Type: System.Object

Der Rückgabewert des aufgerufenen Delegaten bzw. null, wenn der Delegat keinen Wert zurückgibt.

Delegaten sind Funktionszeigern in C oder C++-Sprachen. Delegaten einen Verweis auf eine Methode in ein Delegatobjekt zu kapseln. Das Delegatobjekt an Code, der die referenzierte Methode ruft dann übergeben werden kann, und die aufgerufene Methode kann zum Zeitpunkt der Kompilierung unbekannt. Im Gegensatz zu Funktionszeigern in C oder C++ sind Delegaten objektorientiert, typsicher und sicherer.

Die Invoke -Methode durchsucht, um die Kette der übergeordneten Elemente bis zu einem Steuerelement oder Formular, das ein Fenster zu verarbeiten, wenn das zugrunde liegende Fensterhandle des aktuellen Steuerelements noch nicht vorhanden ist. Wenn kein geeignetes Handle gefunden werden kann, die Invoke Methode löst eine Ausnahme aus. Während des Aufrufs ausgelöste Ausnahmen werden an den Aufrufer weitergegeben.

System_CAPS_noteHinweis

Zusätzlich zu der InvokeRequired -Eigenschaft, es gibt vier Methoden in einem Steuerelement threadsicher werden: Invoke, BeginInvoke, EndInvoke, und CreateGraphics wenn das Handle für das Steuerelement bereits erstellt wurde. Aufrufen von CreateGraphics vor Erstellung das Handle des Steuerelements in einem Hintergrundthread unzulässigen threadübergreifenden aufrufen kann. Für alle anderen Methodenaufrufe sollten Sie eine der Aufrufmethoden, um den Thread des Steuerelements zu marshallen verwenden.

Der Delegat kann eine Instanz von EventHandler, in diesem Fall der Absenderparameter dieses Steuerelement enthält und die Ereignisparameter enthält EventArgs.Empty. Der Delegat kann auch eine Instanz von MethodInvoker, oder einen beliebigen anderen Delegaten, der eine leere Parameterliste akzeptiert. Ein Aufruf einer EventHandler oder MethodInvoker Delegaten werden schneller als das Aufrufen des Delegaten in einen anderen.

System_CAPS_noteHinweis

Wenn der Thread, der die Nachricht verarbeitet werden soll, nicht mehr aktiv ist, möglicherweise eine Ausnahme ausgelöst werden.

Im folgenden Codebeispiel wird veranschaulicht, Steuerelemente, die einen Delegaten enthalten. Der Delegat kapselt eine Methode, die im Listenfeld Elemente hinzugefügt, und diese Methode wird für den Thread, der Besitzer das zugrunde liegende Handle des Formulars ist, ausgeführt. Klickt der Benutzer auf die Schaltfläche Invoke führt den Delegaten.

/*
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
Verfügbar seit 1.1
Zurück zum Anfang
Anzeigen: