Замена параллельной библиотеки задач для BackgroundWorker?

83

Есть ли в параллельной библиотеке задач что-нибудь, что можно было бы считать заменой или улучшением по сравнению с классом BackgroundWorker?

У меня есть приложение WinForms с пользовательским интерфейсом в стиле мастера, и оно выполняет некоторые длительные задачи. Я хочу иметь гибкий пользовательский интерфейс со стандартным индикатором выполнения и возможностью отмены операции. Я делал это раньше с BackgroundWorker, но мне интересно, есть ли какие-то шаблоны TPL, которые можно использовать вместо этого?

Кейт Дж.
источник

Ответы:

91

TaskКласс является улучшением по сравнению BackgroundWorker; он, естественно, поддерживает вложение (родительские / дочерние задачи), использует новый API отмены, продолжения задач и т. д.

В моем блоге есть пример , показывающий старый BackgroundWorkerи новый Taskспособ ведения дел. У меня есть небольшой вспомогательный класс для задач, которые должны сообщать о ходе выполнения, потому что я нахожу синтаксис довольно неудобным. Пример охватывает значения результатов, условия ошибок, отмену и отчеты о ходе выполнения.

Стивен Клири
источник
Трудно выбрать между этим и ответом Хэтча, поскольку это технически правильный ответ. Однако в вашем блоге показано, как использовать новый класс Task, и это действительно то, что я искал - эволюция от BackgroundWorker. Я использую ваш пример как основу для кода в своем приложении.
Keith G
2
Несколько дней назад я написал сравнение различных техник фоновой обработки . BackgroundWorkerимеет более легкий отчет о проделанной работе, в то время как Taskпозволяет вложение. Из двух я предпочитаю Task( гораздо проще очистить отчеты о ходе выполнения, чем разрешить вложение). Однако они оба на световые годы опережают другие распространенные решения. Я съеживаюсь, когда слышу, что люди используют Threadили ThreadPool.QueueUserWorkItem. Их труднее всего правильно использовать для фоновых задач.
Стивен Клири,
Более легкий отчет о прогрессе? Только если все хочешь сообщить в процентах. Сообщение о чем-либо еще требует begininvoke или SynchronizationContext.Post некрасивости
Панайотис Канавос
5
@PanagiotisKanavos: Вы можете передать любой произвольный объект как userState. Однако за 2,5 года, прошедшие с момента моего последнего комментария, Taskон был дополнен IProgress<T>и Progress<T>, которые чище и проще, чем BackgroundWorkerпрогресс. В современном коде вообще нет смысла использовать BackgroundWorker.
Стивен Клири
Да, я только что заметил. Каким-то образом этот пост оказался наверху, когда я нажал на тег TPL, чтобы найти новые вопросы!
Панайотис Канавос
23

Фоновый рабочий процесс по-прежнему является допустимым способом достижения этого - если вы одновременно выполняете несколько больших операций, стоит подумать о параллельных расширениях, если это только одно, я бы придерживался фонового рабочего.

Люк
источник