Información general sobre el componente BackgroundWorker

Muchas operaciones que se realizan habitualmente pueden tardar mucho tiempo en ejecutarse. Por ejemplo:

  • Descargas de imágenes

  • Invocaciones de servicios web

  • Descargas y cargas de archivos (incluidas aplicaciones punto a punto)

  • Cálculos locales complejos

  • Transacciones de bases de datos

  • Acceso a disco local, debido a su baja velocidad con relación al acceso a la memoria

Operaciones como éstas pueden hacer que la interfaz de usuario se bloquee mientras se están ejecutando. Si quiere una interfaz de usuario con capacidad de respuesta y está sufriendo grandes retrasos asociados con estas operaciones, el componente BackgroundWorker ofrece una solución apropiada.

El componente BackgroundWorker le ofrece la posibilidad de ejecutar operaciones prolongadas de forma asincrónica ("en segundo plano"), en un subproceso diferente del subproceso principal de la interfaz de usuario de la aplicación. Para usar un BackgroundWorker, solo tiene que decirle qué método de trabajo prolongado debe ejecutar en segundo plano y, después, llame al método RunWorkerAsync. El subproceso que realiza la llamada continúa ejecutándose normalmente mientras el método de trabajo se ejecuta asincrónicamente. Cuando el método termina, el BackgroundWorker alerta al subproceso que realizó la llamada activando el evento RunWorkerCompleted que, opcionalmente, contiene el resultado de la operación.

El componente BackgroundWorker está disponible en el Cuadro de herramientas, en la pestaña Componentes. Para agregar un BackgroundWorker al formulario, arrastre el componente BackgroundWorker hasta el formulario. Aparece en la bandeja de componentes, y sus propiedades aparecen en la ventana Propiedades.

Para iniciar la operación asincrónica, use el método RunWorkerAsync. RunWorkerAsync toma un parámetro object opcional, que se puede usar para pasar argumentos al método de trabajo. La clase BackgroundWorker expone el evento DoWork, al que el subproceso de trabajo se asocia mediante un controlador de evento DoWork.

El controlador de evento DoWork toma un parámetro DoWorkEventArgs, que tiene una propiedad Argument. Esta propiedad recibe el parámetro de RunWorkerAsync y se puede pasar al método de trabajo, al que se llamará en el controlador de evento DoWork. En el ejemplo siguiente se muestra cómo asignar un resultado de un método de trabajo llamado ComputeFibonacci. Forma parte de un ejemplo más grande, que puede encontrar en Cómo: Implementar un formulario que usa una operación en segundo plano.

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

Para obtener más información sobre cómo usar controladores de evento, consulte Eventos.

Precaución

Cuando se usa multithreading de algún tipo, se expone a posibles errores muy graves y complejos. Vea Procedimientos recomendados para el subprocesamiento administrado antes de implementar cualquier solución que utilice multithreading.

Para más información sobre el uso de la clase BackgroundWorker, consulte Cómo: Ejecutar una operación en segundo plano.

Consulte también