BackgroundWorker.DoWork Evento

Definição

Ocorre quando RunWorkerAsync() é chamado.

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 seguinte demonstra a utilização 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

Observações

Este evento é levantado quando se chama o RunWorkerAsync método. É aqui que se inicia a operação que realiza o trabalho potencialmente demorado.

O seu código no DoWork gestor de eventos deve verificar periodicamente o valor da CancellationPending propriedade e abortar a operação se for true. Quando isto acontece, pode definir o Cancel flag de System.ComponentModel.DoWorkEventArgs para true, e o Cancelled flag de System.ComponentModel.RunWorkerCompletedEventArgs no seu RunWorkerCompleted handler de eventos será definido para true.

Atenção

Tenha em atenção que o seu código no DoWork handler de eventos pode terminar o seu trabalho enquanto um pedido de cancelamento está a ser feito, e o seu ciclo de sondagens pode não CancellationPending ter sido definido para true. Neste caso, a Cancelled flag de System.ComponentModel.RunWorkerCompletedEventArgs no teu RunWorkerCompleted gestor de eventos não será definida para true, mesmo que tenha sido feito um pedido de cancelamento. Esta situação é chamada condição de corrida e é uma preocupação comum na programação multithread. Para mais informações sobre questões de design de multithreading, consulte Melhores Práticas de Gestão de Threading.

Se a sua operação produzir um resultado, pode atribuir o resultado à DoWorkEventArgs.Result propriedade. Este estará disponível para o RunWorkerCompleted responsável pelo evento na RunWorkerCompletedEventArgs.Result propriedade.

Se a operação gerar uma exceção que o seu código não trata, apanha BackgroundWorker a exceção e passa-a para o RunWorkerCompleted gestor de eventos, onde é exposta como propriedade Error de System.ComponentModel.RunWorkerCompletedEventArgs. Se estiver a correr sob o depurador Visual Studio, o depurador irá quebrar-se no ponto do gestor de eventos DoWork onde a exceção não tratada foi levantada. Se tiver mais do que um BackgroundWorker, não deve referenciar nenhum deles diretamente, pois isso acoplaria o seu DoWork gestor de eventos a uma instância específica de BackgroundWorker. Em vez disso, deves aceder ao teu BackgroundWorker lançando o sender parâmetro no teu DoWork gestor de eventos.

Deve ter cuidado para não manipular quaisquer objetos da interface de utilizador no seu DoWork gestor de eventos. Em vez disso, comunique-se com a interface do usuário por meio dos BackgroundWorker eventos.

Para mais informações sobre como gerir eventos, consulte Gestão e Levantamento de Eventos.

Aplica-se a

Ver também