通过


Control.BeginInvoke 方法

定义

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

重载

名称 说明
BeginInvoke(Delegate, Object[])

在创建控件的基础句柄的线程上,使用指定的参数异步执行指定的委托。

BeginInvoke(Action)

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

BeginInvoke(Delegate)

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

BeginInvoke(Delegate, Object[])

Source:
Control.cs
Source:
Control.cs
Source:
Control.cs
Source:
Control.cs
Source:
Control.cs

在创建控件的基础句柄的线程上,使用指定的参数异步执行指定的委托。

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);
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 表示操作的结果 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)

Source:
Control.cs
Source:
Control.cs
Source:
Control.cs
Source:
Control.cs
Source:
Control.cs

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

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 表示操作的结果 BeginInvoke(Action)

适用于

BeginInvoke(Delegate)

Source:
Control.cs
Source:
Control.cs
Source:
Control.cs
Source:
Control.cs
Source:
Control.cs

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

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 表示操作的结果 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 可能会导致非法跨线程调用。 对于所有其他方法调用,应使用其中一个调用方法封送对控件线程的调用。 调用方法始终在控件的线程上调用其回调。

注释

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

另请参阅

适用于