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.
Precaució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.