Evaluar y enviar comentarios

  Encender vista de ancho de banda bajo
Esta página es específica de
Microsoft Visual Studio 2005/.NET Framework 2.0

Hay además otras versiones disponibles para:
Biblioteca de clases de .NET Framework
BackgroundWorker.DoWork (Evento)

Nota: este evento es nuevo en la versión 2.0 de .NET Framework.

Se produce cuando se llama a RunWorkerAsync.

Espacio de nombres: System.ComponentModel
Ensamblado: System (en system.dll)

Visual Basic (Declaración)
Public Event DoWork As DoWorkEventHandler
Visual Basic (Uso)
Dim instance As BackgroundWorker
Dim handler As DoWorkEventHandler

AddHandler instance.DoWork, handler
C#
public event DoWorkEventHandler DoWork
C++
public:
event DoWorkEventHandler^ DoWork {
    void add (DoWorkEventHandler^ value);
    void remove (DoWorkEventHandler^ value);
}
J#
/** @event */
public void add_DoWork (DoWorkEventHandler value)

/** @event */
public void remove_DoWork (DoWorkEventHandler value)
JScript
JScript admite el uso de eventos, pero no admite la declaración de eventos nuevos.

La llamada al método RunWorkerAsync provoca este evento. Es donde se inicia la operación que realiza el trabajo que puede requerir mucho tiempo.

El código del controlador de eventos DoWork debería comprobar periódicamente el valor de la propiedad CancellationPending y anular la operación cuando sea true. En tal caso, puede establecer el indicador Cancel del objeto System.ComponentModel.DoWorkEventArgs en true, y el indicador Cancelled del objeto System.ComponentModel.RunWorkerCompletedEventArgs del controlador de eventos RunWorkerCompleted se establecerá en true.

Nota de precauciónPrecaución

Tenga en cuenta que el código del controlador de eventos DoWork puede finalizar su trabajo mientras se realiza una solicitud de cancelación y que el bucle de sondeo podría pasar por alto la propiedad CancellationPending que se haya establecido en true. En este caso, el indicador Cancelled del objeto System.ComponentModel.RunWorkerCompletedEventArgs del controlador de eventos RunWorkerCompleted no se establecerá en true aunque se haya realizado una solicitud de cancelación. Esta situación se denomina condición de anticipación y es un problema habitual en la programación con subprocesamiento múltiple. Para obtener más información sobre los problemas de diseño de subprocesamiento múltiple, vea Procedimientos recomendados para el subprocesamiento administrado.

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

Si la operación provoca una excepción que el código no controla, BackgroundWorker detecta la excepción y la pasa al controlador de eventos RunWorkerCompleted, donde se expone como la propiedad Error de System.ComponentModel.RunWorkerCompletedEventArgs. Si está ejecutando el depurador de Visual Studio, éste se interrumpirá en el punto del controlador de eventos DoWork en el que se haya provocado la excepción no controlada. Si tiene más de un BackgroundWorker, es mejor que no haga referencia directamente a ninguno de ellos, puesto que esto emparejaría el controlador de eventos DoWork a una instancia concreta de BackgroundWorker. En su lugar, debe obtener acceso a BackgroundWorker convirtiendo el parámetro sender del controlador de eventos DoWork.

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

Para obtener más información sobre la forma de controlar eventos, vea Utilizar eventos.

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

Visual Basic
' 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 'backgroundWorker1_DoWork
C#
// 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);
}
C++
// 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 );
}
J#
// 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 = (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.set_Result(new Long(ComputeFibonacci(System.Convert.ToInt32
        (e.get_Argument()), worker, e)));
    //e.Result = ComputeFibonacci((int)e.Argument, worker, e); 
} //backgroundWorker1_DoWork

Windows 98, Windows 2000 SP4, Windows Millennium, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition

.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

.NET Framework

Compatible con: 2.0
Contenido de la comunidad   ¿Qué es Community Content?
Agregar contenido nuevo RSS  Anotaciones
Processing
© 2009 Microsoft Corporation. Reservados todos los derechos. Términos de uso  |  Marcas Registradas  |  Privacidad
Page view tracker