Substituição da biblioteca paralela de tarefas para BackgroundWorker?

83

A biblioteca paralela de tarefas tem algo que seria considerado uma substituição ou melhoria em relação à classe BackgroundWorker?

Eu tenho um aplicativo WinForms com uma IU estilo assistente e ele executa algumas tarefas de longa duração. Desejo ter uma IU responsiva com a barra de progresso padrão e capacidade de cancelar a operação. Já fiz isso antes com BackgroundWorker, mas estou me perguntando se existem alguns padrões TPL que podem ser usados ​​no lugar?

Keith G
fonte

Respostas:

91

A Taskaula é uma melhoria em relação ao BackgroundWorker; naturalmente suporta aninhamento (tarefas pai / filho), usa a nova API de cancelamento, continuações de tarefas, etc.

Tenho um exemplo no meu blog , mostrando a velha BackgroundWorkermaneira de fazer as coisas e a nova Taskmaneira de fazer as coisas. Eu tenho uma pequena classe de auxiliar para tarefas que precisam relatar o progresso, porque acho a sintaxe um pouco estranha. O exemplo cobre valores de resultados, condições de erro, cancelamento e relatórios de progresso.

Stephen Cleary
fonte
É difícil decidir entre isso e a resposta de Hatch, já que sua resposta é tecnicamente correta. No entanto, seu blog mostra como usar a nova classe Task, e isso é realmente o que eu estava procurando - uma evolução do BackgroundWorker. Estou usando seu exemplo como base para o código em meu aplicativo.
Keith G
2
Alguns dias atrás, escrevi uma comparação de várias técnicas de processamento em segundo plano . BackgroundWorkertem relatórios de progresso mais fáceis, enquanto Taskpermite aninhamento. Dos dois, eu prefiro Taskmuito mais fácil limpar o relatório de progresso do que permitir o aninhamento). Ambos estão anos-luz à frente de outras soluções comuns, no entanto. Eu me encolho quando ouço falar de pessoas usando Threadou ThreadPool.QueueUserWorkItem. Eles são absolutamente os mais difíceis de usar corretamente para tarefas em segundo plano.
Stephen Cleary
Relatórios de progresso mais fáceis? Somente se você quiser relatar uma porcentagem. Reportar qualquer outra coisa requer begininvoke ou SynchronizationContext.Post feiúra
Panagiotis Kanavos
5
@PanagiotisKanavos: Você pode passar qualquer objeto arbitrário como userState. No entanto, nos 2,5 anos desde meu último comentário, Taskfoi complementado com IProgress<T>e Progress<T>, que são mais limpos e mais fáceis do que BackgroundWorkero progresso de. No código moderno, não há razão para usar BackgroundWorkermais.
Stephen Cleary
Sim, acabei de notar. De alguma forma, esta postagem veio em primeiro lugar quando cliquei na tag TPL para encontrar novas perguntas!
Panagiotis Kanavos
23

O trabalhador em segundo plano ainda é uma maneira válida de conseguir isso - se você estiver executando várias operações grandes simultaneamente, vale a pena considerar as extensões paralelas. Se for apenas uma, eu ficaria com o trabalhador em segundo plano.

Escotilha
fonte