BackgroundWorker по сравнению с фоновым потоком

Можно добавить любые методы, которые Вы любите на объектах класса, определенных в коде Python (иначе исправление обезьяны):

>>> class A(object):
>>>     pass


>>> def stuff(self):
>>>     print self

>>> A.test = stuff
>>> A().test()

Это не работает над встроенными типами, потому что их __dict__ не перезаписываемо (это dictproxy).

Так не, в Python нет никакого "реального" дополнительного механизма метода.

163
задан Naser Asadi 4 August 2013 в 09:01
поделиться

8 ответов

Насколько я понимаю ваш вопрос, вы используете BackgroundWorker в качестве стандартного потока.

Причина, по которой BackgroundWorker рекомендуется для вещей то, что вы не хотите связывать поток пользовательского интерфейса, заключается в том, что он предоставляет некоторые приятные события при разработке Win Forms.

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

Так что, если вы не их используете, я не вижу никакого вреда в использовании стандартного Тема для того, что вам нужно сделать.

87
ответ дан 23 November 2019 в 21:16
поделиться

Некоторые из моих мыслей ...

  1. Используйте BackgroundWorker , если у вас есть отдельная задача, которая выполняется в фоновом режиме и требует взаимодействовать с пользовательским интерфейсом. Задача маршалинга данных и вызовов методов в поток пользовательского интерфейса выполняется автоматически с помощью его модели, основанной на событиях. Избегайте BackgroundWorker, если ...
    • ваша сборка не имеет или не взаимодействует напрямую с UI,
    • вам нужно, чтобы поток был потоком переднего плана, или
    • вам нужно управлять приоритетом потока.
  2. Используйте ThreadPool , когда требуется эффективность. ThreadPool помогает избежать накладных расходов, связанных с созданием, запуском и остановкой потоков. Избегайте использования ThreadPool, если ...
    • задача выполняется в течение всего времени существования вашего приложения,
    • вам нужно, чтобы поток был потоком переднего плана,
    • вам нужно управлять приоритетом потока, или
    • вам нужно, чтобы поток имел фиксированную идентификацию (прерывание, приостановка, обнаружение).
  3. Используйте класс Thread для длительных задач и когда вам требуются функции, предлагаемые формальной потоковой моделью, например, выбор между приоритетным и фоновым потоками, настройка потока приоритет, детальный контроль над выполнением потоков и т. д.
361
ответ дан 23 November 2019 в 21:16
поделиться

Также вы привязываете поток пула потоков на время жизни фонового рабочего, что может вызывать беспокойство, поскольку их ограниченное количество. Я бы сказал, что если вы создаете поток только один раз для своего приложения (и не используете какие-либо функции фонового рабочего), тогда используйте поток, а не поток фонового рабочего / пула потоков.

11
ответ дан 23 November 2019 в 21:16
поделиться

Если он не сломан - исправляйте, пока он не станет ... шучу :)

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

2
ответ дан 23 November 2019 в 21:16
поделиться

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

2
ответ дан 23 November 2019 в 21:16
поделиться

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

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

1
ответ дан 23 November 2019 в 21:16
поделиться

В значительной степени то, что сказал Мэтт Дэвис, со следующими дополнительными пунктами:

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

Задачи, выполняемые через ThreadPool , не могут быть легко отменены (включая ThreadPool . QueueUserWorkItem и делегаты выполняются асинхронно). Таким образом, хотя это позволяет избежать накладных расходов на раскрутку потока, если вам нужна отмена, используйте либо BackgroundWorker , либо (что более вероятно вне пользовательского интерфейса) разверните поток и сохраните ссылку на него, чтобы вы могли вызвать Отмена () .

12
ответ дан 23 November 2019 в 21:16
поделиться

Я знал, как использовать потоки, еще до того, как узнал .NET, поэтому мне пришлось немного привыкнуть к когда я начал использовать BackgroundWorkers. Мэтт Дэвис прекрасно резюмировал разницу: но я бы добавил, что сложнее понять, что именно делает код, и это может усложнить отладку. Легче думать о создании и закрытии потоков, ИМО, чем думать о предоставлении работы пулу потоков.

Я до сих пор не могу комментировать сообщения других людей, так что простите мою временную хромоту в использовании ответа на адрес piers7

Не используйте Thread.Abort (); вместо этого сигнализируйте о событии и проектируйте свой поток так, чтобы он завершался корректно при получении сигнала. Thread.Abort () вызывает исключение ThreadAbortException в произвольной точке выполнения потока, которое может делать все виды неприятных вещей, такие как сиротские мониторы, поврежденное общее состояние и т. Д. http://msdn.microsoft.com/en-us/library/system.threading.thread.abort.aspx

5
ответ дан 23 November 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: