Compartir a través de


Información general sobre el componente BackgroundWorker

Hay muchas operaciones normalmente realizadas que pueden tardar mucho tiempo en ejecutarse. Por ejemplo:

  • Descargas de imágenes

  • Invocaciones de servicio web

  • Descargas y cargas de archivos (incluidas las aplicaciones de tipo peer-to-peer)

  • Cálculos locales complejos

  • Transacciones de base de datos

  • Acceso al disco local, dada su velocidad lenta relativa al acceso a la memoria

Las operaciones como estas pueden hacer que la interfaz de usuario se bloquee mientras se ejecutan. Si desea una interfaz de usuario con capacidad de respuesta y se enfrenta a retrasos prolongados asociados a estas operaciones, el BackgroundWorker componente proporciona una solución cómoda.

El BackgroundWorker componente ofrece la capacidad de ejecutar operaciones que consumen mucho tiempo 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, basta con indicarle qué método de trabajo que tarda mucho tiempo ejecutar en segundo plano y, a continuación, llamar al método RunWorkerAsync. El subproceso de llamada continúa ejecutándose normalmente mientras el método de trabajo se ejecuta de forma asincrónica. Una vez finalizado el método, la BackgroundWorker alerta al subproceso que realiza la llamada activando el RunWorkerCompleted evento, que opcionalmente contiene los resultados de la operación.

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

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

El DoWork controlador de eventos toma un DoWorkEventArgs parámetro, que tiene la propiedad Argument. Esta propiedad recibe el parámetro de RunWorkerAsync y se puede pasar a tu método de trabajo, el cual será llamado en el controlador de eventos DoWork. En el ejemplo siguiente se muestra cómo asignar un resultado de un método de trabajo denominado 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 el uso de controladores de eventos, vea Eventos.

Precaución

Al usar multithreading de cualquier tipo, puede exponerse a errores muy graves y complejos. Consulte los procedimientos recomendados de subprocesos administrados antes de implementar cualquier solución que use multithreading.

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

Consulte también