Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > C#: работа с потоками


Автор: Socrates 25.6.2012, 23:32
Друзья, нужен ваш совет.

В программе два потока. Первый управляет GUI, это основной поток. Второй - фоновый, BackgroundWorker.

Вопрос такой: нужно, чтобы нажатие GUI-кнопки сразу же останавливало BackgroundWorker. Как его лучше всего "убить"?

Автор: Fortnox 26.6.2012, 07:24
Использовать метод http://msdn.microsoft.com/ru-ru/library/system.componentmodel.backgroundworker.cancelasync.aspx у BackgroundWorker. Только следует учесть, что этот метод не останавливает сразу работу фонового потока, а лишь посылает сообщение worker'у (устанавливает флаг CancellationPending в true), а вы уже, в рабочем коде, должны проверять этот флаг.

Автор: Socrates 26.6.2012, 09:12
Fortnox, спасибо большое!

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

Автор: Fortnox 26.6.2012, 09:24
Можно, для этого в Background Worker сохряняется рабочий поток в переменную, чтобы потом вызвать Abort у него.
http://osherove.com/blog/2005/11/9/creating-a-better-backgroundworker-cancelimmediately-and-oth.html

Автор: Socrates 26.6.2012, 20:12
Цитата(Fortnox @ 26.6.2012,  09:24)
Можно, для этого в Background Worker сохряняется рабочий поток в переменную, чтобы потом вызвать Abort у него.

Fortnox, 

Спасибо!! Буду изучать пример.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)