Control.BeginInvoke 方法

定义

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

重载

BeginInvoke(Delegate, Object[])

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

BeginInvoke(Action)

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

BeginInvoke(Delegate)

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

BeginInvoke(Delegate, Object[])

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

public:
 virtual IAsyncResult ^ BeginInvoke(Delegate ^ method, cli::array <System::Object ^> ^ args);
public:
 virtual IAsyncResult ^ BeginInvoke(Delegate ^ method, ... cli::array <System::Object ^> ^ args);
public IAsyncResult BeginInvoke (Delegate method, object[] args);
public IAsyncResult BeginInvoke (Delegate method, params object[] args);
abstract member BeginInvoke : Delegate * obj[] -> IAsyncResult
override this.BeginInvoke : Delegate * obj[] -> IAsyncResult
Public Function BeginInvoke (method As Delegate, args As Object()) As IAsyncResult
Public Function BeginInvoke (method As Delegate, ParamArray args As Object()) As IAsyncResult

参数

method
Delegate

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

args
Object[]

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

返回

IAsyncResult

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

实现

例外

找不到适当的窗口句柄。

示例

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

private:
   delegate void MyDelegate(
   Label^ myControl, String^ myArg2 );
   void Button_Click( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
      array<Object^>^myArray = gcnew array<Object^>(2);
      myArray[ 0 ] = gcnew Label;
      myArray[ 1 ] = "Enter a Value";
      myTextBox->BeginInvoke( gcnew MyDelegate( this, &MyForm::DelegateMethod ), myArray );
   }

   void DelegateMethod( Label^ myControl, String^ myCaption )
   {
      myControl->Location = Point(16,16);
      myControl->Size = System::Drawing::Size( 80, 25 );
      myControl->Text = myCaption;
      this->Controls->Add( myControl );
   }

   delegate void InvokeDelegate();
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);
}
Delegate Sub MyDelegate(myControl As Label, myArg2 As String)

Private Sub Button_Click(sender As Object, e As EventArgs)
   Dim myArray(1) As Object
   
   myArray(0) = New Label()
   myArray(1) = "Enter a Value"
   myTextBox.BeginInvoke(New MyDelegate(AddressOf DelegateMethod), myArray)
End Sub

Public Sub DelegateMethod(myControl As Label, myCaption As String)
   myControl.Location = New Point(16, 16)
   myControl.Size = New Size(80, 25)
   myControl.Text = myCaption
   Me.Controls.Add(myControl)
End Sub

注解

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

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

备注

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

备注

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

另请参阅

适用于

BeginInvoke(Action)

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

public:
 IAsyncResult ^ BeginInvoke(Action ^ method);
public IAsyncResult BeginInvoke (Action method);
member this.BeginInvoke : Action -> IAsyncResult
Public Function BeginInvoke (method As Action) As IAsyncResult

参数

method
Action

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

返回

IAsyncResult

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

适用于

BeginInvoke(Delegate)

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

public:
 IAsyncResult ^ BeginInvoke(Delegate ^ method);
public IAsyncResult BeginInvoke (Delegate method);
member this.BeginInvoke : Delegate -> IAsyncResult
Public Function BeginInvoke (method As Delegate) As IAsyncResult

参数

method
Delegate

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

返回

IAsyncResult

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

例外

找不到适当的窗口句柄。

示例

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

private:
   void Invoke_Click( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
      myTextBox->BeginInvoke( gcnew InvokeDelegate( this, &MyForm::InvokeMethod ) );
   }

   void InvokeMethod()
   {
      myTextBox->Text = "Executed the given delegate";
   }
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";
}
Delegate Sub InvokeDelegate()

Private Sub Invoke_Click(sender As Object, e As EventArgs)
   myTextBox.BeginInvoke(New InvokeDelegate(AddressOf InvokeMethod))
End Sub

Public Sub InvokeMethod()
   myTextBox.Text = "Executed the given delegate"
End Sub

注解

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

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

备注

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

备注

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

另请参阅

适用于