¿La biblioteca de tareas en paralelo tiene algo que se considere un reemplazo o mejora sobre la clase BackgroundWorker?
Tengo una aplicación WinForms con una interfaz de usuario de estilo asistente y realiza algunas tareas de larga duración. Quiero poder tener una interfaz de usuario receptiva con la barra de progreso estándar y la capacidad de cancelar la operación. He hecho esto antes con BackgroundWorker, pero me pregunto si hay algunos patrones TPL que se puedan usar en su lugar.
Respuestas:
La
Task
clase es una mejora sobre laBackgroundWorker
; naturalmente, admite la anidación (tareas principales / secundarias), utiliza la nueva API de cancelación, continuación de tareas, etc.Tengo un ejemplo en mi blog , que muestra la
BackgroundWorker
forma antigua de hacer las cosas y la nuevaTask
forma de hacer las cosas. Tengo una pequeña clase de ayuda para las tareas que necesitan informar el progreso, porque encuentro la sintaxis bastante incómoda. El ejemplo cubre los valores de los resultados, las condiciones de error, la cancelación y los informes de progreso.fuente
BackgroundWorker
tiene informes de progreso más fáciles, mientras queTask
permite anidar. De los dos, prefieroTask
(es mucho más fácil limpiar los informes de progreso que permitir el anidamiento). Sin embargo, ambos están a años luz de otras soluciones comunes. Me estremezco cuando escucho que la gente usaThread
oThreadPool.QueueUserWorkItem
. Son los más difíciles de usar correctamente para tareas en segundo plano.userState
. Sin embargo, en los 2.5 años transcurridos desde mi último comentario,Task
se ha complementado conIProgress<T>
yProgress<T>
, que son más limpios y fáciles queBackgroundWorker
el progreso. En el código moderno, ya no hay ninguna razón para usarloBackgroundWorker
.El trabajador en segundo plano sigue siendo una forma válida de lograr esto: si está ejecutando múltiples operaciones grandes al mismo tiempo, valdría la pena considerar las extensiones paralelas, si es solo una, entonces me quedaría con el trabajador en segundo plano.
fuente