Compartilhar via


BackgroundWorker.DoWork Evento

Definição

Ocorre quando RunWorkerAsync() é chamado.

public:
 event System::ComponentModel::DoWorkEventHandler ^ DoWork;
public event System.ComponentModel.DoWorkEventHandler DoWork;
public event System.ComponentModel.DoWorkEventHandler? DoWork;
member this.DoWork : System.ComponentModel.DoWorkEventHandler 
Public Custom Event DoWork As DoWorkEventHandler 

Tipo de evento

Exemplos

O exemplo de código a seguir demonstra o uso do DoWork evento para iniciar uma operação assíncrona. Este exemplo de código faz parte de um exemplo maior fornecido para a BackgroundWorker classe.

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

Comentários

Esse evento é gerado quando você chama o RunWorkerAsync método. É aí que você inicia a operação que executa o trabalho potencialmente demorado.

Seu código no DoWork manipulador de eventos deve verificar periodicamente o valor da CancellationPending propriedade e anular a operação se ela for true. Quando isso ocorrer, você pode definir o Cancel sinalizador como System.ComponentModel.DoWorkEventArgstrue, e o Cancelled sinalizador do manipulador RunWorkerCompleted de System.ComponentModel.RunWorkerCompletedEventArgs eventos será definido como true.

Cuidado

Lembre-se de que seu DoWork código no manipulador de eventos pode concluir seu trabalho à medida que uma solicitação de cancelamento está sendo feita, e seu loop de sondagem pode perder CancellationPending a definição truecomo . Nesse caso, o Cancelled sinalizador do manipulador RunWorkerCompleted de System.ComponentModel.RunWorkerCompletedEventArgs eventos não será definido comotrue, mesmo que uma solicitação de cancelamento tenha sido feita. Essa situação é chamada de condição de corrida e é uma preocupação comum na programação multithreaded. Para obter mais informações sobre problemas de design multithreading, consulte As Práticas Recomendadas de Threading Gerenciado.

Se a operação produzir um resultado, você poderá atribuir o resultado à DoWorkEventArgs.Result propriedade. Isso estará disponível para o RunWorkerCompleted manipulador de eventos na RunWorkerCompletedEventArgs.Result propriedade.

Se a operação gerar uma exceção que seu código não manipula, a BackgroundWorker exceção será capturada e a passará para o RunWorkerCompleted manipulador de eventos, em que ela será exposta como a Error propriedade de System.ComponentModel.RunWorkerCompletedEventArgs. Se você estiver executando sob o depurador do Visual Studio, o depurador será interrompido no ponto no manipulador de eventos em DoWork que a exceção sem tratamento foi gerada. Se você tiver mais de um BackgroundWorker, não deverá referenciar nenhum deles diretamente, pois isso associaria seu DoWork manipulador de eventos a uma instância específica de BackgroundWorker. Em vez disso, você deve acessar a conversão BackgroundWorker do sender parâmetro no manipulador DoWork de eventos.

Você deve ter cuidado para não manipular nenhum objeto de interface do usuário no manipulador DoWork de eventos. Em vez disso, comunique-se com a interface do usuário por meio dos BackgroundWorker eventos.

Para obter mais informações sobre como lidar com eventos, consulte Manipulando e levantando eventos.

Aplica-se a

Confira também