Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Метод Control.Invoke (Delegate)

 

Опубликовано: Октябрь 2016

Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.

Пространство имен:   System.Windows.Forms
Сборка:  System.Windows.Forms (в System.Windows.Forms.dll)

public object Invoke(
	Delegate method
)

Параметры

method
Type: System.Delegate

Делегат, содержащий метод, который требуется вызывать в контексте потока элемента управления.

Возвращаемое значение

Type: System.Object

Значение, возвращаемое вызываемым делегатом, или значение null, если делегат не возвращает никакого значения.

Делегаты аналогичны указателям функций в языках программирования C или C++. Делегаты инкапсулируют ссылку на метод внутри объекта делегата. Объект делегата может затем передаваться коду, который вызывает метод, на который указывает ссылка, и вызываемый метод может быть неизвестен во время компиляции. В отличие от указателей функций в C или C++ делегаты являются объектно ориентированного, строго типизированным и безопаснее.

Invoke Выполняет метод цепочку родительского элемента управления, пока находит элемент управления или форму с периодом обработки, если базовый дескриптор окна текущего элемента управления еще не существует. Если соответствующий дескриптор не обнаружен, Invoke метод вызовет исключение. Исключения, возникающие во время вызова передается обратно вызывающему.

System_CAPS_noteПримечание

В дополнение к InvokeRequired Свойства, существует четыре метода для элемента управления, которые являются потокобезопасными: Invoke, BeginInvoke, EndInvoke, и CreateGraphics Если уже был создан дескриптор для элемента управления. Вызов CreateGraphics до создания дескриптора элемента управления в фоновом потоке может вызвать недопустимое перекрестных вызовов потоков. Для вызова всех остальных методов следует использовать один из методов invoke, чтобы маршалировать вызов в поток элемента управления.

Делегат может быть экземпляром EventHandler, в этом случае параметр отправителя будет содержать этот элемент управления, и будет содержать параметр события EventArgs.Empty. Делегат также может быть экземпляр MethodInvoker, или любого другого делегата с пустым списком параметров. Вызов EventHandler или MethodInvoker делегат будет быстрее, чем вызов делегата другого типа.

System_CAPS_noteПримечание

Исключение может выдаваться, если поток, в котором должно обрабатываться сообщение, больше не является активным.

В следующем примере кода показываются элементы управления, содержащие делегат. Делегат инкапсулирует метод, который добавляет элементы в списке, и этот метод выполняется в потоке, которому принадлежит базовый дескриптор формы. Когда пользователь нажимает кнопку, Invoke выполняет делегат.

/*
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
Доступно с 1.1
Вернуться в начало
Показ: