BackgroundWorker.DoWork Evento
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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.