Была ли эта страница полезной?
Ваш отзыв об этом контенте важен для нас. Расскажите нам о том, что вы думаете.
Дополнительный отзыв?
1500 символов осталось
Invoke - метод (Delegate)
Collapse the table of content
Expand the table of content
Данная статья переведена автоматически. Наведите указатель мыши на предложения статьи, чтобы просмотреть исходный текст. Дополнительные сведения.
Перевод
Текст оригинала

Control.Invoke - метод (Delegate)

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

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

public Object Invoke(
	Delegate method
)

Параметры

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

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

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

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

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

ПримечаниеПримечание

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

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

ПримечаниеПримечание

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

В следующем примере кода показываются элементы управления, содержащие делегат. Делегат инкапсулирует метод, добавляющий элементы к списку, и этот метод выполняется в потоке, который является владельцем базового дескриптора формы. Когда пользователь нажимает кнопку, запускается делегат 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

Поддерживается в версиях: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework (клиентский профиль)

Поддерживается в версиях: 4, 3.5 с пакетом обновления 1 (SP1)

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista с пакетом обновления 2 (SP2), Windows Server 2008 (роль основных серверных компонентов не поддерживается), Windows Server 2008 R2 (роль основных серверных компонентов поддерживается в пакете обновления 1 (SP1) или выше; системы на базе Itanium не поддерживаются)

Среда .NET Framework поддерживает не все версии каждой платформы. Поддерживаемые версии перечислены в разделе Требования к системе для .NET Framework.

Добавления сообщества

ДОБАВИТЬ
Показ:
© 2015 Microsoft