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?
Respostas:
A
Task
aula é uma melhoria em relação aoBackgroundWorker
; 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
BackgroundWorker
maneira de fazer as coisas e a novaTask
maneira 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.fonte
BackgroundWorker
tem relatórios de progresso mais fáceis, enquantoTask
permite aninhamento. Dos dois, eu prefiroTask
(é muito 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 usandoThread
ouThreadPool.QueueUserWorkItem
. Eles são absolutamente os mais difíceis de usar corretamente para tarefas em segundo plano.userState
. No entanto, nos 2,5 anos desde meu último comentário,Task
foi complementado comIProgress<T>
eProgress<T>
, que são mais limpos e mais fáceis do queBackgroundWorker
o progresso de. No código moderno, não há razão para usarBackgroundWorker
mais.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.
fonte