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 以從委派擷取傳回值。 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 以從委派擷取傳回值。 EndInvoke 將會封鎖,直到可以擷取傳回值為止。

注意

控制項上的大部分方法只能從建立控制項的執行緒呼叫。 除了 InvokeRequired 屬性之外,控制項上還有四個安全線程的方法: InvokeBeginInvokeEndInvoke 、,以及 CreateGraphics 控制項的控制碼是否已建立。 在背景執行緒上建立控制項的控制碼之前呼叫 CreateGraphics ,可能會導致不合法的跨執行緒呼叫。 對於所有其他方法呼叫,您應該使用其中一個叫用方法來封送處理控制項執行緒的呼叫。 叫用方法一律會在控制項的執行緒上叫用其回呼。

注意

如果應該處理訊息的執行緒不再使用中,可能會擲回例外狀況。

另請參閱

適用於