Partilhar via


Control.BeginInvoke Método

Definição

Executa um delegado de forma assíncrona no thread em que o identificador subjacente do controle foi criado.

Sobrecargas

BeginInvoke(Delegate, Object[])

Executa o delegado especificado de forma assíncrona com os argumentos especificados, no thread em que o identificador subjacente do controle foi criado.

BeginInvoke(Action)

Executa o delegado especificado de forma assíncrona no thread em que o identificador subjacente do controle foi criado.

BeginInvoke(Delegate)

Executa o delegado especificado de forma assíncrona no thread em que o identificador subjacente do controle foi criado.

BeginInvoke(Delegate, Object[])

Executa o delegado especificado de forma assíncrona com os argumentos especificados, no thread em que o identificador subjacente do controle foi criado.

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

Parâmetros

method
Delegate

Um delegado para um método que usa parâmetros do mesmo número e tipo contidos no parâmetro args.

args
Object[]

Uma matriz de objetos a serem passados como argumentos para o método em questão. Pode ser null, caso nenhum argumento seja necessário.

Retornos

IAsyncResult

Um IAsyncResult que representa o resultado da operação BeginInvoke(Delegate).

Implementações

Exceções

Não foi possível encontrar um identificador de janela apropriado.

Exemplos

O exemplo de código a seguir demonstra o uso do BeginInvoke método.

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

Comentários

O delegado é chamado de forma assíncrona e esse método retorna imediatamente. Você pode chamar esse método de qualquer thread, até mesmo o thread que possui o identificador do controle. Se o identificador do controle ainda não existir, esse método pesquisará a cadeia pai do controle até encontrar um controle ou formulário que tenha um identificador de janela. Se nenhum identificador apropriado puder ser encontrado, BeginInvoke lançará uma exceção. As exceções dentro do método delegado são consideradas não rastreadas e serão enviadas para o manipulador de exceção não mapeado do aplicativo.

Você pode chamar EndInvoke para recuperar o valor retornado do delegado, se o neccesário, mas isso não é necessário. EndInvoke será bloqueado até que o valor retornado possa ser recuperado.

Observação

A maioria dos métodos em um controle só pode ser chamada do thread em que o controle foi criado. Além da InvokeRequired propriedade, há quatro métodos em um controle que são thread safe: Invoke, e BeginInvokeEndInvokeCreateGraphics se o identificador para o controle já foi criado. Chamar CreateGraphics antes que o identificador do controle tenha sido criado em um thread em segundo plano pode causar chamadas cruzadas ilegais. Para todas as outras chamadas de método, você deve usar um dos métodos de invocação para fazer marshaling da chamada para o thread do controle. Os métodos de invocação sempre invocam seus retornos de chamada no thread do controle.

Observação

Uma exceção poderá ser gerada se o thread que deve processar a mensagem não estiver mais ativo.

Confira também

Aplica-se a

BeginInvoke(Action)

Executa o delegado especificado de forma assíncrona no thread em que o identificador subjacente do controle foi criado.

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

Parâmetros

method
Action

Um delegado para um método que não tem parâmetros.

Retornos

IAsyncResult

Um IAsyncResult que representa o resultado da operação BeginInvoke(Action).

Aplica-se a

BeginInvoke(Delegate)

Executa o delegado especificado de forma assíncrona no thread em que o identificador subjacente do controle foi criado.

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

Parâmetros

method
Delegate

Um delegado para um método que não tem parâmetros.

Retornos

IAsyncResult

Um IAsyncResult que representa o resultado da operação BeginInvoke(Delegate).

Exceções

Não foi possível encontrar um identificador de janela apropriado.

Exemplos

O exemplo de código a seguir demonstra o uso do BeginInvoke método.

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

Comentários

O delegado é chamado de forma assíncrona e esse método retorna imediatamente. Você pode chamar esse método de qualquer thread, até mesmo o thread que possui o identificador do controle. Se o identificador do controle ainda não existir, esse método pesquisará a cadeia pai do controle até encontrar um controle ou formulário que tenha um identificador de janela. Se nenhum identificador apropriado puder ser encontrado, BeginInvoke lançará uma exceção. As exceções dentro do método delegado são consideradas não rastreadas e serão enviadas para o manipulador de exceção não mapeado do aplicativo.

Você pode chamar EndInvoke para recuperar o valor retornado do delegado, se o neccesário, mas isso não é necessário. EndInvoke será bloqueado até que o valor retornado possa ser recuperado.

Observação

A maioria dos métodos em um controle só pode ser chamada do thread em que o controle foi criado. Além da InvokeRequired propriedade, há quatro métodos em um controle que são thread safe: Invoke, e BeginInvokeEndInvokeCreateGraphics se o identificador para o controle já foi criado. Chamar CreateGraphics antes que o identificador do controle tenha sido criado em um thread em segundo plano pode causar chamadas cruzadas ilegais. Para todas as outras chamadas de método, você deve usar um dos métodos de invocação para fazer marshaling da chamada para o thread do controle. Os métodos de invocação sempre invocam seus retornos de chamada no thread do controle.

Observação

Uma exceção poderá ser gerada se o thread que deve processar a mensagem não estiver mais ativo.

Confira também

Aplica-se a