C # прерывание потока перестало работать - PullRequest
2 голосов
/ 05 апреля 2009

Я не знаю, почему, но я больше не могу прерывать свою нить.

thread = new Thread(new ParameterizedThreadStart(this.doWork));
thread.Start(param);
...
thread.Interrupt();
//in doWork()
try {
...
}
catch (System.Threading.ThreadInterruptedException)
{
//it never hits here. it use to
}

Я ищу, и у меня нет никакого улова в моем коде, и это единственный улов (System.Threading.ThreadInterruptedException). Так, что происходит? Используя отладчик, я вижу, как мой код выполняется через thread.Interrupt () ;. Если я сделаю thread.abort (), я поймаю исключение System.Threading.ThreadAbortException. Почему это ловит, а не ThreadInterruptedException?

Ответы [ 2 ]

4 голосов
/ 05 апреля 2009

С BOL :

Прерывает поток, который находится в Состояние потока WaitSleepJoin.

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

ThreadInterruptedException выбрасывается в прерванной теме, но не пока поток не блокируется. Если нить никогда не блокирует, исключение не бывает брошен, и, таким образом, поток может полный, никогда не будучи прервала

Кстати, вам лучше использовать класс BackgroundWorker, который поддерживает отмену.

0 голосов
/ 05 апреля 2009

Из комментария acidzombie24 к другому ответу :

Так .abort - лучший вариант? То, что я хочу сделать, это убить поток, но он существует и вызвать несколько функций вместо прямой смерти

Что-то вроде события было бы лучше.

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

Если вы хотите прервать поток, вызовите Установите на событие. В рабочем потоке регулярно проверяйте состояние события:

if (theEvent.WaitOne(TimeSpan.Zero)) {
  // Handle the interruption.
}

(Регулярно: должно определяться требованиями: накладные расходы на проверку в сравнении с задержкой прерывания.)

Чтобы иметь главное прерывание, чтобы подать сигнал всем работникам, используйте ManualResetEvent , который будет оставаться сигнальным, и продолжайте прерывать потоки при проверке, пока явно Сброс .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...