Estoy usando un BackgroundWorker para realizar un cálculo largo (solo uno de estos cálculos a la vez).Cancelar un BackgroundWorker, cómo evitar la carrera cuando ya ha terminado
El usuario tiene la posibilidad de cancelar el trabajador (llamando a worker.CancelAsync).
En el método worker.DoWork reviso periódicamente el indicador de cancelar pendiente y luego regreso del método.
Luego se completa el evento Completado del trabajador y puedo verificar que el trabajador haya sido cancelado. Además, y eso es lo importante, realizo una limpieza adicional cuando se detecta una cancelación.
Estoy seguro de que podría haber un problema si el usuario cancela al trabajador y ya ha sido devuelto por el método DoWork. En ese caso, me gustaría saber que el trabajador fue cancelado para poder realizar la limpieza ...
¿Hay una forma mejor de manejar el procedimiento de cancelación, con la limpieza, de un trabajador?
Esa es una explicación muy clara. Sin embargo, dado que el trabajo no se realiza únicamente en el método "DoWork", tendría que pasar los EventArgs a todas las clases que verificarían la cancelación y tengo alrededor de 30 de esas clases (problema de optimización profunda). Esto es factible pero creo que sería un PITA ... Tampoco me gusta que esas clases tengan que gestionar la cancelación. Todavía estoy buscando una mejor manera. –
"Tampoco me gustan esas clases que tienen que gestionar la cancelación" - No entiendo su preocupación. Si es así, ¡no haga que administren la cancelación! En su lugar, solo verifique la cancelación cuando una de estas clases devuelva el control a su método principal de DoWork. – Joe
Esas clases internas están haciendo un cálculo realmente largo y, por lo tanto, no regresan con frecuencia. –