2010-03-05 2 views
3

У меня есть приложение, которое использует 20 потоков. Это почтовый клиент, который использует потоки для отправки почты.Отмена тем

В настоящее время потоки создаются в основном потоке. Но мне интересно, что, если я хочу отменить всю операцию? Единственный способ увидеть это - убить основной поток ... таким образом, заканчивая программу.

Должен ли я создать поток, который инкапсулирует потоки для рассылки, чтобы я мог убить инкапсулирующую нить?

В настоящее время я использую BackgroundWorker, и это приложение WF.

+0

У вас есть 20 фоновых резьб или использование его для других потоков – rerun

ответ

3

Если вы используете BackgroundWorker, то у вас уже есть вся инфраструктура, необходимая для отмены операции. Просто установите WorkerSupportsCancellation на true на BackgroundWorker и вызовите метод рабочего CancelAsync, если вы хотите отменить.

Очевидно, что вы должны написать рабочий код, чтобы почтить отмена. Вы делаете это, проверяя свойство CancellationPendingBackgroundWorker.

MSDN имеет example, используя эту собственность.


Примечание - Я немного смущен комбинацией BackgroundWorker и 20 потоков; a BackgroundWorker использует только один поток. Вы вращаетесь 20 BackgroundWorkers? Если да, то как вы гарантируете, что они правильно настроены? Если вам нужно много параллелизма в приложении Winforms, лучше использовать асинхронные делегаты или пул потоков.

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

ManualResetEvent cancelEvent = new ManualResetEvent(false); 
for (int i = 0; i < 20; i++) 
{ 
    ThreadPool.QueueUserWorkItem(s => 
    { 
     // Do some work 
     if (cancelEvent.WaitOne(0, true)) 
      return; 
     // Do some more work 
     // etc. 
    }); 
} 

Затем в какой-то момент позже, если вы пишете cancelEvent.Set(), каждый работник прекратит свою работу, как только она попадает на проверку состояния.

+0

Да, но не будет ли это просто отменять текущий поток? Каждый поток настроен на отправку электронной почты выбранному набору писем из базы данных компаний. Так что, если бы я должен был отменить эту тему, остальные 19 остались бы в живых? –

+0

Ах, извините, просто прочитайте конец ответа. –