¿Reemplazo de la biblioteca paralela de tareas para BackgroundWorker?

83

¿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.

Keith G
fuente

Respuestas:

91

La Taskclase es una mejora sobre la BackgroundWorker; 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 BackgroundWorkerforma antigua de hacer las cosas y la nueva Taskforma 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.

Stephen Cleary
fuente
Es difícil decidir entre esto y la respuesta de Hatch, ya que la suya es técnicamente una respuesta correcta. Sin embargo, su blog muestra cómo usar la nueva clase Task, y eso es realmente lo que estaba buscando: una evolución de BackgroundWorker. Estoy usando su ejemplo como base para el código en mi aplicación.
Keith G
2
Hace unos días escribí una comparación de varias técnicas de procesamiento de fondo . BackgroundWorkertiene informes de progreso más fáciles, mientras que Taskpermite anidar. De los dos, prefiero Task(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 usa Threado ThreadPool.QueueUserWorkItem. Son los más difíciles de usar correctamente para tareas en segundo plano.
Stephen Cleary
¿Informes de progreso más fáciles? Solo si todo lo que quieres reportar es un porcentaje. Informar cualquier otra cosa requiere begininvoke o SynchronizationContext.Post fealdad
Panagiotis Kanavos
5
@PanagiotisKanavos: puede pasar cualquier objeto arbitrario como userState. Sin embargo, en los 2.5 años transcurridos desde mi último comentario, Taskse ha complementado con IProgress<T>y Progress<T>, que son más limpios y fáciles que BackgroundWorkerel progreso. En el código moderno, ya no hay ninguna razón para usarlo BackgroundWorker.
Stephen Cleary
Sí, me acabo de dar cuenta. De alguna manera, esta publicación llegó a lo más alto cuando hice clic en la etiqueta TPL para encontrar nuevas preguntas.
Panagiotis Kanavos
23

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.

Escotilla
fuente