2009-04-14 5 views
8

Каковы плюсы и минусы в использовании либо для достижения заданной задачи.BackgroundWorker и Threads

Вопрос о миллионе долларов, какой из них использовать и когда?

Большое спасибо.

ответ

3

Я использую, чтобы ассоциировать BackgroundWorker как оболочку для того, что делали бы Threads. Поэтому я использую BackgroundWorker для работы с графическим интерфейсом и Threads на более специализированных или грязных работах (Windows Services и т. Д.)

12

Если в разделе «Темы» вы подразумеваете явно использование класса System.Threading.Thread для создания, настройки и запуска собственных потоков, тогда ответ заключается в том, что выполнение этой работы с вашей стороны требует большего количества циклов процессора, чем просто вытягивая поток из пула потоков (это то, что делают другие методы), но оно дает вам больше гибкости, поскольку оно позволяет вам указать приоритет потока, а несколько других характеристик, которые используют потоки пулов потоков, вам не позволяют.

Подход «Пул потоков» более подходит, когда количество требуемых потоков не известно во время разработки. Сначала пул содержит небольшое количество потоков, «готовых» для вас, чтобы вызвать их. Он может динамически создавать новые потоки по требованию, и он управляет созданием, координацией и удалением неиспользуемых потоков для вас. Существует три механизма, которые вы можете использовать для доступа и использования потоков из пула.

  1. Используя Delegate.BeginInvoke() (наиболее распространенный метод)
  2. Использование таймеров (несколько вариаций)
  3. System.Threading.ThreadPool обеспечивает несколько других функций (BackgroundWorker класса, QueueUserWorkItem() и т.д.) ,
3

Нити, только если вам не нужно работать с пользовательским интерфейсом (WinForms или WPF) и фоновыми работниками, когда вы это делаете должны иметь дело с пользовательским интерфейсом.

Вы избежите проблем с пользовательскими интерфейсами и фоновыми работниками.

1

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

6

Взгляните на this great threading overview:

[BackgroundWorker] предоставляет следующие возможности:

  • А "отменить" флаг для сигнализации работника до конца без использования Прервать

  • Стандартный протокол для отчетности о ходе, завершении и аннулировании

  • Реализация IComponent позволяет ему быть расположено в студии Визуальный конструктор обработка исключений на рабочем потоке

  • возможность обновления Windows Forms и WPF управления в ответ на прогресс работника или завершения.

последних двух функций, особенно полезны - это означает, что вы не должны включать/поймать блок попробовать в вашем методе рабочий, и может обновлять Windows Forms и WPF управления без необходимости вызывать Control.Invoke.

1

Класс BackgroundWorker просто предоставляет события, которые для вас переключены в контексте потока пользовательского интерфейса, но не путайте; событие DoWork (в котором вы фактически выполняете эту работу) все еще выполняется в контексте другого потока (поскольку это и есть цель всего этого) и выполнения какого-либо взаимодействия или обновления интерфейса, там будет исключение на и в худшем случае. BackgroundWorker следует использовать в формах, когда вы пытаетесь сделать что-то, что требует обновления пользовательского интерфейса, и область действия которого не распространяется за пределы формы. Для других фоновых операций рассмотрите либо использование ThreadPool (для краткосрочных операций), либо создание собственного потока.

BackgroundWorker обеспечивает удобство с событием ProgressChanged, но не слишком удобно и начинает выполнять обновления пользовательского интерфейса в DoWork.