Partilhar via


Visão geral do componente BackgroundWorker

Há muitas operações comumente realizadas que podem levar muito tempo para serem executadas. Por exemplo:

  • Downloads de imagens

  • Invocações de serviço Web

  • Transferências e carregamentos de ficheiros (incluindo para aplicações peer-to-peer)

  • Cálculos locais complexos

  • Transações de banco de dados

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

Operações como estas podem bloquear a interface do utilizador enquanto estão em execução. Quando você deseja uma interface do usuário responsiva e se depara com longos atrasos associados a essas operações, o componente BackgroundWorker fornece uma solução conveniente.

O componente BackgroundWorker oferece a capacidade de executar operações demoradas de forma assíncrona ("em segundo plano"), em um thread diferente do thread principal da interface do usuário do aplicativo. Para usar um BackgroundWorker, simplesmente indique que método de trabalho, exigente em termos de tempo, deve ser executado em segundo plano e, em seguida, chame o método RunWorkerAsync. Seu thread de chamada continua a ser executado normalmente enquanto o método de trabalho é executado de forma assíncrona. Quando o método é concluído, o BackgroundWorker alerta o thread de chamada disparando o evento RunWorkerCompleted, que opcionalmente contém os resultados da operação.

O componente BackgroundWorker está disponível no Toolbox, na guia Components. Para adicionar um BackgroundWorker ao formulário, arraste o componente BackgroundWorker para o formulário. Ele aparece na bandeja do componente e suas propriedades aparecem na janela Propriedades.

Para iniciar a operação assíncrona, use o método RunWorkerAsync. RunWorkerAsync usa um parâmetro object opcional, que pode ser usado para passar argumentos para seu método de trabalho. A classe BackgroundWorker expõe o evento DoWork, ao qual o thread de trabalho é anexado por meio de um manipulador de eventos DoWork.

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

// 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 = 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 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

Para obter mais informações sobre como usar manipuladores de eventos, consulte Events.

Atenção

Ao usar multithreading de qualquer tipo, você potencialmente se expõe a bugs muito sérios e complexos. Consulte as Práticas Recomendadas de Threading Gerenciado antes de implementar qualquer solução que use multithreading.

Para obter mais informações sobre como usar a classe BackgroundWorker, consulte Como executar uma operação em segundo plano.

Ver também