BackgroundWorker и темы - PullRequest
       14

BackgroundWorker и темы

8 голосов
/ 14 апреля 2009

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

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

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

Ответы [ 6 ]

12 голосов
/ 14 апреля 2009

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

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

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

Посмотрите на этот великолепный обзор потоков :

[BackgroundWorker] предоставляет следующие функции:

  • Флаг отмены для оповещения работника об окончании без использования Abort

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

  • Реализация IComponent, позволяющая разместить его в Visual Studio Designer Обработка исключений в рабочем потоке

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

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

3 голосов
/ 14 апреля 2009

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

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

3 голосов
/ 14 апреля 2009

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

1 голос
/ 14 апреля 2009

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

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

1 голос
/ 14 апреля 2009

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

...