Можно добавить любые методы, которые Вы любите на объектах класса, определенных в коде Python (иначе исправление обезьяны):
>>> class A(object):
>>> pass
>>> def stuff(self):
>>> print self
>>> A.test = stuff
>>> A().test()
Это не работает над встроенными типами, потому что их __dict__
не перезаписываемо (это dictproxy
).
Так не, в Python нет никакого "реального" дополнительного механизма метода.
Насколько я понимаю ваш вопрос, вы используете BackgroundWorker
в качестве стандартного потока.
Причина, по которой BackgroundWorker
рекомендуется для вещей то, что вы не хотите связывать поток пользовательского интерфейса, заключается в том, что он предоставляет некоторые приятные события при разработке Win Forms.
Такие события, как RunWorkerCompleted
, чтобы сигнализировать, когда поток завершил то, что ему нужно было сделать, и событие ProgressChanged
для обновления графического интерфейса пользователя по ходу потоков.
Так что, если вы не их используете, я не вижу никакого вреда в использовании стандартного Тема для того, что вам нужно сделать.
Некоторые из моих мыслей ...
Также вы привязываете поток пула потоков на время жизни фонового рабочего, что может вызывать беспокойство, поскольку их ограниченное количество. Я бы сказал, что если вы создаете поток только один раз для своего приложения (и не используете какие-либо функции фонового рабочего), тогда используйте поток, а не поток фонового рабочего / пула потоков.
Если он не сломан - исправляйте, пока он не станет ... шучу :)
А если серьезно, BackgroundWorker, вероятно, очень похож на то, что у вас уже есть, если бы вы начали с него с самого начала, возможно, вы сэкономили бы время - но на данный момент я не вижу в этом необходимости. Если что-то не работает или вы думаете, что ваш текущий код трудно понять, я бы остановился на том, что у вас есть.
Основное отличие состоит, как вы заявили, в создании событий графического интерфейса пользователя из BackgroundWorker
. Если потоку не нужно обновлять отображение или генерировать события для основного потока графического интерфейса пользователя, то это может быть простой поток.
Фоновый рабочий процесс - это класс, который работает в отдельном потоке, но он предоставляет дополнительные функции, которых нет в простом потоке (например, обработка отчета о ходе выполнения задачи).
Если вам не нужны дополнительные функции, предоставляемые фоновым работником - а, похоже, вы этого не делаете - тогда более подходящим будет Thread.
В значительной степени то, что сказал Мэтт Дэвис, со следующими дополнительными пунктами:
Для Для меня основным отличием BackgroundWorker
является автоматическая сортировка завершенного события через SynchronizationContext
. В контексте пользовательского интерфейса это означает, что завершенное событие запускается в потоке пользовательского интерфейса, и поэтому его можно использовать для обновления пользовательского интерфейса. Это главное отличие, если вы используете BackgroundWorker
в контексте пользовательского интерфейса.
Задачи, выполняемые через ThreadPool
, не могут быть легко отменены (включая ThreadPool
. QueueUserWorkItem
и делегаты выполняются асинхронно). Таким образом, хотя это позволяет избежать накладных расходов на раскрутку потока, если вам нужна отмена, используйте либо BackgroundWorker
, либо (что более вероятно вне пользовательского интерфейса) разверните поток и сохраните ссылку на него, чтобы вы могли вызвать Отмена ()
.
Я знал, как использовать потоки, еще до того, как узнал .NET, поэтому мне пришлось немного привыкнуть к когда я начал использовать BackgroundWorkers. Мэтт Дэвис прекрасно резюмировал разницу: но я бы добавил, что сложнее понять, что именно делает код, и это может усложнить отладку. Легче думать о создании и закрытии потоков, ИМО, чем думать о предоставлении работы пулу потоков.
Я до сих пор не могу комментировать сообщения других людей, так что простите мою временную хромоту в использовании ответа на адрес piers7
Не используйте Thread.Abort (); вместо этого сигнализируйте о событии и проектируйте свой поток так, чтобы он завершался корректно при получении сигнала. Thread.Abort () вызывает исключение ThreadAbortException в произвольной точке выполнения потока, которое может делать все виды неприятных вещей, такие как сиротские мониторы, поврежденное общее состояние и т. Д. http://msdn.microsoft.com/en-us/library/system.threading.thread.abort.aspx