BackgroundWorker componente visão geral

Há muitas operações mais comuns que podem levar muito time para executar.Por exemplo:

  • Download de imagens

  • Invocações de serviço Web

  • Arquivo downloads e uploads (incluindo de aplicativos de mesmo nível a de mesmo nível)

  • Locais de computações complexas

  • Transações do banco de dados

  • Acesso ao disco local, dado sua velocidade lenta em relação ao acesso à memória

Operações como esses podem causar sua interface do usuário parar enquanto eles estão em execução.Quando você deseja uma interface do usuário de responder e você enfrenta longos atrasos associados a essas operações, a BackgroundWorker componente fornece uma solução conveniente.

The BackgroundWorkercomponente oferece capacidade de executar operações demoradas de forma assíncrona ("no plano de fundo"), em um thread diferente do thread da interface do usuário principal do aplicativo. Para usar um BackgroundWorker, você simplesmente dizer a ele qual método de trabalho demorado para executar em segundo plano e, em seguida, chame o RunWorkerAsync método. O thread de chamada continuará a ser executado normalmente enquanto o método operador é executada assincronamente.Quando o método for concluído, a BackgroundWorker alerta o segmento de chamada, o acionamento do RunWorkerCompleted evento contém, opcionalmente, os resultados da operação.

The BackgroundWorker componente está disponível a partir do Caixa de ferramentas, in the Componentes guia.Para adicionar um BackgroundWorker para seu formulário, arrastar o BackgroundWorker componente para seu formulário. Ele aparece no componente bandeja e suas propriedades são exibidos no Propriedades janela.

Para iniciar a operação assíncrono, use o RunWorkerAsync método. RunWorkerAsync usa um recurso opcional object parâmetro pode ser usado para passar argumentos para o seu método de trabalho. The BackgroundWorker classe expõe o DoWork evento, à qual o thread de trabalho está conectado por meio de um DoWork manipulador de eventos.

The DoWork manipulador de eventos leva uma DoWorkEventArgs parâmetro, que tem um Argument propriedade. Esta propriedade recebe o parâmetro de RunWorkerAsync e pode ser passada para o seu método de trabalho que será chamado DoWork evento manipulador. O exemplo a seguir mostra como atribuir um resultado de um método de trabalho chamado ComputeFibonacci. Isso faz parte de um exemplo maior, que pode ser encontrado em Como: Implementar um formulário que usa uma operação em segundo plano.

' This event handler is where the actual work is done.
Private Sub backgroundWorker1_DoWork( _
ByVal sender As Object, _
ByVal e As DoWorkEventArgs) _
Handles backgroundWorker1.DoWork

    ' Get the BackgroundWorker object that raised this event.
    Dim worker As BackgroundWorker = _
        CType(sender, BackgroundWorker)

    ' Assign the result of the computation
    ' to the Result property of the DoWorkEventArgs
    ' object. This is will be available to the 
    ' RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci(e.Argument, worker, e)
End Sub 'backgroundWorker1_DoWork
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, 
    DoWorkEventArgs e)
{   
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = sender as BackgroundWorker;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the 
    // RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
// This event handler is where the actual,
// potentially time-consuming work is done.
void backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
   // Get the BackgroundWorker that raised this event.
   BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);

   // Assign the result of the computation
   // to the Result property of the DoWorkEventArgs
   // object. This is will be available to the 
   // RunWorkerCompleted eventhandler.
   e->Result = ComputeFibonacci( safe_cast<Int32>(e->Argument), worker, e );
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e)
{
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = (BackgroundWorker)sender;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the 
    // RunWorkerCompleted eventhandler.
    e.set_Result(new Long(ComputeFibonacci(System.Convert.ToInt32
        (e.get_Argument()), worker, e)));
    //e.Result = ComputeFibonacci((int)e.Argument, worker, e); 
} //backgroundWorker1_DoWork

Para obter mais informações sobre o uso de manipuladores de eventos, consulte Eventos e representantes.

Cuidado:

Ao usar multithreading de qualquer tipo, você potencialmente expor você mesmo a bugs muito sérios e complexos.Consulte o Gerenciado Threading práticas recomendadas  antes de implementar qualquer solução que use o multithreading.

Para obter mais informações sobre como usar o BackgroundWorker classe, consulte Como: Executar uma operação no plano de fundo.

Consulte também

Tarefas

Como: Implementar um formulário que usa uma operação em segundo plano

Outros recursos

Multisegmentação no Visual Basic