Необработанное исключение ThreadInteruptedException в службе Windows - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть служба Windows, которая иногда падает и останавливается при возникновении необработанного исключения ThreadInteruptedException.Основная функция этого сервиса - запускать синхронизацию каждые x минут (пользовательский промежуток времени).Я только один раз использую метод Thread.Interrupt () дважды (потому что знаю, насколько это может быть грязно) -

Клиент может подключиться через TCP-соединение, но если данные отправляются клиенту слишком быстрочтобы справиться с этим, он может отправить сигнал «паузы» обратно в службу, а затем возобновит работу, когда все данные будут обработаны (это могут быть беспроводные устройства и несколько клиентов, работающих на разных скоростях, поэтому я не сталне хочу оставлять все это в буферах TCP).Затем Pause переводит нить в спящий режим, а возобновление прерывает это и продолжает.

Другое использование происходит в аналогичной ситуации, когда соединение TCP первоначально подключается.

Однако я позволил этомуслужба запущена и это исключение выдается даже когда я не подключаю никаких клиентов!Соединения TCP не устанавливаются, и поэтому ни один из этих методов прерывания не достигается!Я поместил операторы try, чтобы перехватить это исключение вокруг каждого Thread.Sleep () в сервисе, но это исключение все еще вызывается!

Я уверен, что упускаю что-то действительно очевидное, но это просто невыскочил на меня, и я искал несколько дней!

  1. Кто-нибудь когда-либо сталкивался с этим раньше?
  2. У кого-нибудь есть дешевые альтернативы сну и прерыванию потока (не во время(пауза) продолжить;)
  3. Кто-нибудь знает простой способ отладки такого необработанного исключения?Я даже не вижу в стеке, чтобы выяснить, откуда он исходит!
  4. Может ли какой-либо другой метод вызвать исключение ThreadInterruptedException?Или другие методы могут привести к прерыванию спящего потока?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Для тех, кто читает это. Мой принятый ответ - комментарий Ханса Пассанта. Это решение работало так же хорошо и избавилось от любых ThreadInterruptedExceptions

Галстук не падает с неба. Улучшите ваш код, удалив вызовы Interrupt () и заменив их на Auto / ManualResetEvent.Set ().

0 голосов
/ 07 апреля 2011

Я не вижу, чтобы возникали исключения из методов, которые не даже не вызваны.

Кроме того, ThreadInteruptedException вызывается не методом Sleep, а методом Interupt, поэтому try / catch на Sleep здесь не имеет значения.

С MSDN :

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

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