Control.BeginInvoke 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
在创建控件的基础句柄所在线程上异步执行委托。
重载
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 操作的结果的 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 属性之外,控件上还有四种方法是线程安全的: Invoke、 BeginInvoke、 EndInvoke以及 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 操作的结果的 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 操作的结果的 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 属性之外,控件上还有四种方法是线程安全的: Invoke、 BeginInvoke、 EndInvoke以及 CreateGraphics 控件的句柄是否已创建。 在后台线程上创建控件句柄之前调用 CreateGraphics 可能会导致非法跨线程调用。 对于所有其他方法调用,应使用其中一个调用方法封送对控件线程的调用。 调用方法始终在控件的线程上调用其回调。
备注
如果应处理消息的线程不再处于活动状态,则可能会引发异常。