BackgroundWorker.DoWork Evento

Definición

Se produce cuando se llama a RunWorkerAsync().

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

Ejemplos

En el ejemplo de código siguiente se muestra el uso del DoWork evento para iniciar una operación asincrónica. Este ejemplo de código es parte de un ejemplo más grande proporcionado para la clase BackgroundWorker.

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

Comentarios

Este evento se genera cuando se llama al RunWorkerAsync método . Aquí es donde se inicia la operación que realiza el trabajo potencialmente lento.

El código del DoWork controlador de eventos debe comprobar periódicamente el valor de la CancellationPending propiedad y anular la operación si es true. Cuando esto ocurre, puede establecer la Cancel marca de System.ComponentModel.DoWorkEventArgs en truey la Cancelled marca de en el controlador de System.ComponentModel.RunWorkerCompletedEventArgs eventos se establecerá trueen RunWorkerCompleted .

Precaución

Tenga en cuenta que el código del DoWork controlador de eventos puede finalizar su trabajo a medida que se realiza una solicitud de cancelación y es posible que el bucle de sondeo no CancellationPending se establezca trueen . En este caso, la Cancelled marca de en el RunWorkerCompleted controlador de System.ComponentModel.RunWorkerCompletedEventArgs eventos no se establecerá trueen , aunque se haya realizado una solicitud de cancelación. Esta situación se denomina condición de carrera y es una preocupación común en la programación multiproceso. Para obtener más información sobre los problemas de diseño de multithreading, consulte Procedimientos recomendados para subprocesos administrados.

Si la operación genera un resultado, puede asignar el resultado a la DoWorkEventArgs.Result propiedad . Esto estará disponible para el RunWorkerCompleted controlador de eventos en la RunWorkerCompletedEventArgs.Result propiedad .

Si la operación genera una excepción que el código no controla, BackgroundWorker detecta la excepción y la pasa al RunWorkerCompleted controlador de eventos, donde se expone como la Error propiedad de System.ComponentModel.RunWorkerCompletedEventArgs. Si se ejecuta en el depurador de Visual Studio, el depurador se interrumpirá en el punto del controlador de eventos en el DoWork que se generó la excepción no controlada. Si tiene más de un BackgroundWorker, no debe hacer referencia a ninguno de ellos directamente, ya que esto acoplaría el DoWork controlador de eventos a una instancia específica de BackgroundWorker. En su lugar, debe acceder a BackgroundWorker mediante la conversión del parámetro en DoWork el sender controlador de eventos.

Debe tener cuidado de no manipular ningún objeto de interfaz de usuario en el DoWork controlador de eventos. En su lugar, comuníquese con la interfaz de usuario a través de los eventos BackgroundWorker.

Para obtener más información acerca de cómo controlar eventos, vea controlar y provocar eventos.

Se aplica a

Consulte también