Есть ли в параллельной библиотеке задач что-нибудь, что можно было бы считать заменой или улучшением по сравнению с классом BackgroundWorker?
У меня есть приложение WinForms с пользовательским интерфейсом в стиле мастера, и оно выполняет некоторые длительные задачи. Я хочу иметь гибкий пользовательский интерфейс со стандартным индикатором выполнения и возможностью отмены операции. Я делал это раньше с BackgroundWorker, но мне интересно, есть ли какие-то шаблоны TPL, которые можно использовать вместо этого?
Ответы:
Task
Класс является улучшением по сравнениюBackgroundWorker
; он, естественно, поддерживает вложение (родительские / дочерние задачи), использует новый API отмены, продолжения задач и т. д.В моем блоге есть пример , показывающий старый
BackgroundWorker
и новыйTask
способ ведения дел. У меня есть небольшой вспомогательный класс для задач, которые должны сообщать о ходе выполнения, потому что я нахожу синтаксис довольно неудобным. Пример охватывает значения результатов, условия ошибок, отмену и отчеты о ходе выполнения.источник
BackgroundWorker
имеет более легкий отчет о проделанной работе, в то время какTask
позволяет вложение. Из двух я предпочитаюTask
( гораздо проще очистить отчеты о ходе выполнения, чем разрешить вложение). Однако они оба на световые годы опережают другие распространенные решения. Я съеживаюсь, когда слышу, что люди используютThread
илиThreadPool.QueueUserWorkItem
. Их труднее всего правильно использовать для фоновых задач.userState
. Однако за 2,5 года, прошедшие с момента моего последнего комментария,Task
он был дополненIProgress<T>
иProgress<T>
, которые чище и проще, чемBackgroundWorker
прогресс. В современном коде вообще нет смысла использоватьBackgroundWorker
.Фоновый рабочий процесс по-прежнему является допустимым способом достижения этого - если вы одновременно выполняете несколько больших операций, стоит подумать о параллельных расширениях, если это только одно, я бы придерживался фонового рабочего.
источник