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

Comentários

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

Seu código no DoWork manipulador de eventos deve marcar periodicamente o valor da CancellationPending propriedade e anular a operação se for true. Quando isso ocorrer, você poderá definir o Cancel sinalizador de System.ComponentModel.DoWorkEventArgs como truee o Cancelled sinalizador de em seu RunWorkerCompleted manipulador de System.ComponentModel.RunWorkerCompletedEventArgs eventos será definido truecomo .

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 o loop de sondagem pode perder CancellationPending a definição como true. Nesse caso, o Cancelled sinalizador de System.ComponentModel.RunWorkerCompletedEventArgs em seu RunWorkerCompleted manipulador de eventos não será definido truecomo , 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 multithread. Para obter mais informações sobre problemas de design multithreading, consulte 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, o capturará a BackgroundWorker exceção e a transmitirá para o RunWorkerCompleted manipulador de eventos, onde 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 do BackgroundWorker. Em vez disso, você deve acessar o BackgroundWorker convertendo o sender parâmetro em seu DoWork manipulador de eventos.

Você deve ter cuidado para não manipular nenhum objeto de interface do usuário em seu DoWork manipulador 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 gerando eventos.

Aplica-se a

Confira também