Control.BeginInvoke 方法

定义

在创建控件的基础句柄所在线程上异步执行委托。

重载

BeginInvoke(Delegate, Object[])

在创建控件的基础句柄所在线程上,用指定的自变量异步执行指定委托。

BeginInvoke(Action)

在创建控件的基础句柄所在线程上异步执行指定委托。

BeginInvoke(Delegate)

在创建控件的基础句柄所在线程上异步执行指定委托。

BeginInvoke(Delegate, Object[])

在创建控件的基础句柄所在线程上,用指定的自变量异步执行指定委托。

C#
public IAsyncResult BeginInvoke (Delegate method, object[] args);
C#
public IAsyncResult BeginInvoke (Delegate method, params object[] args);

参数

method
Delegate

一个方法委托,它采用的参数的数量和类型与 args 参数中所包含的相同。

args
Object[]

作为给定方法的自变量传递的对象数组。 如果不需要参数,则可以为 null

返回

IAsyncResult

一个表示 IAsyncResult 操作的结果的 BeginInvoke(Delegate)

实现

例外

找不到适当的窗口句柄。

示例

下面的代码示例演示了该方法 BeginInvoke 的使用。

C#
public delegate void MyDelegate(Label myControl, string myArg2);

private void Button_Click(object sender, EventArgs e)
{
   object[] myArray = new object[2];

   myArray[0] = new Label();
   myArray[1] = "Enter a Value";
   myTextBox.BeginInvoke(new MyDelegate(DelegateMethod), myArray);
}

public void DelegateMethod(Label myControl, string myCaption)
{
   myControl.Location = new Point(16,16);
   myControl.Size = new Size(80, 25);
   myControl.Text = myCaption;
   this.Controls.Add(myControl);
}

注解

委托以异步方式调用,此方法会立即返回。 你可以从任何线程调用此方法,即使是拥有控件句柄的线程。 如果控件的句柄尚不存在,此方法将搜索控件的父链,直到找到具有窗口句柄的控件或窗体。 如果未找到适当的句柄, BeginInvoke 将引发异常。 委托方法中的异常被视为未捕获,并将发送到应用程序的未捕获异常处理程序。

可以调用 EndInvoke 以从委托中检索返回值(如果为 neccesary),但这不是必需的。 EndInvoke 将阻止,直到可以检索返回值。

备注

控件上的大多数方法只能从创建控件的线程调用。 除了 InvokeRequired 属性之外,控件上还有四种方法是线程安全的: InvokeBeginInvokeEndInvoke以及 CreateGraphics 控件的句柄是否已创建。 在后台线程上创建控件句柄之前调用 CreateGraphics 可能会导致非法跨线程调用。 对于所有其他方法调用,应使用其中一个调用方法封送对控件线程的调用。 调用方法始终在控件的线程上调用其回调。

备注

如果应处理消息的线程不再处于活动状态,则可能会引发异常。

另请参阅

适用于

.NET Framework 4.8 和其他版本
产品 版本
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
Windows Desktop 3.0, 3.1, 5, 6, 7

BeginInvoke(Action)

在创建控件的基础句柄所在线程上异步执行指定委托。

C#
public IAsyncResult BeginInvoke (Action method);

参数

method
Action

对不带参数的方法的委托。

返回

IAsyncResult

一个表示 IAsyncResult 操作的结果的 BeginInvoke(Action)

适用于

Windows Desktop 7 和 Windows Desktop 6
产品 版本
Windows Desktop 6, 7

BeginInvoke(Delegate)

在创建控件的基础句柄所在线程上异步执行指定委托。

C#
public IAsyncResult BeginInvoke (Delegate method);

参数

method
Delegate

对不带参数的方法的委托。

返回

IAsyncResult

一个表示 IAsyncResult 操作的结果的 BeginInvoke(Delegate)

例外

找不到适当的窗口句柄。

示例

下面的代码示例演示了该方法 BeginInvoke 的使用。

C#
public delegate void InvokeDelegate();

private void Invoke_Click(object sender, EventArgs e)
{
   myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod));
}
public void InvokeMethod()
{
   myTextBox.Text = "Executed the given delegate";
}

注解

委托以异步方式调用,此方法会立即返回。 你可以从任何线程调用此方法,即使是拥有控件句柄的线程。 如果控件的句柄尚不存在,此方法将搜索控件的父链,直到找到具有窗口句柄的控件或窗体。 如果未找到适当的句柄, BeginInvoke 将引发异常。 委托方法中的异常被视为未捕获,并将发送到应用程序的未捕获异常处理程序。

可以调用 EndInvoke 以从委托中检索返回值(如果为 neccesary),但这不是必需的。 EndInvoke 将阻止,直到可以检索返回值。

备注

控件上的大多数方法只能从创建控件的线程调用。 除了 InvokeRequired 属性之外,控件上还有四种方法是线程安全的: InvokeBeginInvokeEndInvoke以及 CreateGraphics 控件的句柄是否已创建。 在后台线程上创建控件句柄之前调用 CreateGraphics 可能会导致非法跨线程调用。 对于所有其他方法调用,应使用其中一个调用方法封送对控件线程的调用。 调用方法始终在控件的线程上调用其回调。

备注

如果应处理消息的线程不再处于活动状态,则可能会引发异常。

另请参阅

适用于

.NET Framework 4.8 和其他版本
产品 版本
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
Windows Desktop 3.0, 3.1, 5, 6, 7