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 以從委派擷取傳回值。 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 以從委派擷取傳回值。 EndInvoke 將會封鎖,直到可以擷取傳回值為止。
注意
控制項上的大部分方法只能從建立控制項的執行緒呼叫。 除了 InvokeRequired 屬性之外,控制項上還有四個安全線程的方法: Invoke 、 BeginInvoke 、 EndInvoke 、,以及 CreateGraphics 控制項的控制碼是否已建立。 在背景執行緒上建立控制項的控制碼之前呼叫 CreateGraphics ,可能會導致不合法的跨執行緒呼叫。 對於所有其他方法呼叫,您應該使用其中一個叫用方法來封送處理控制項執行緒的呼叫。 叫用方法一律會在控制項的執行緒上叫用其回呼。
注意
如果應該處理訊息的執行緒不再使用中,可能會擲回例外狀況。