Windows服务中未处理的ThreadInteruptedException

时间:2011-04-07 10:01:48

标签: c# windows-services

我有一个Windows服务,在抛出未处理的ThreadInteruptedException时偶尔会崩溃并停止。此服务的主要功能是每x分钟(用户定义的时间跨度)运行同步。我只使用过两次Thread.Interrupt()方法(因为我知道它有多乱) -

客户端可以通过TCP连接进行连接,但如果数据发送到客户端的速度太快而无法处理,则可以向服务发送“暂停”信号,然后全部恢复数据已被处理(这些可能是无线设备,并且可能有多个客户端以不同的速度运行,所以我不想在TCP缓冲区中留下任何这些)。暂停然后将线程置于休眠状态,并继续中断此操作并继续。

当TCP连接最初连接时,另一种用途是类似的情况。

但是,我已经让这个服务运行了,即使我没有连接任何客户端也会抛出此异常!没有TCP连接,因此没有达到这些中断方法!我已经把try语句放在服务中的每个Thread.Sleep()周围捕获这个异常,但是仍然会引发这个异常!

我确定我错过了一些非常明显的东西,但它并没有向我跳出来,我一直在寻找好几天!

  1. 有没有人遇到过这个 前?
  2. 有没有人有便宜的 睡觉的替代品 打断一个线程(不是 while(暂停)继续;)
  3. 有谁知道一个简单的方法 调试未处理的异常 像这样?我甚至看不到 堆栈以找出它的位置 来自!
  4. 任何其他方法都可以抛出ThreadInterruptedException吗?或者任何其他方法是否会导致睡眠线程中断?
  5. 提前致谢

2 个答案:

答案 0 :(得分:1)

对于读这篇文章的人。我接受的答案是Hans Passant的评论。这个解决方案同样有效,并且摆脱了任何ThreadInterruptedExceptions

  

TIE不会从天而降。通过删除Interrupt()调用并用Auto / ManualResetEvent.Set()替换它们来改进代码。

答案 1 :(得分:0)

我看不出即使调用 的方法也会引发异常。

此外,ThreadInteruptedException方法不会引发Sleep,而Interupt方法也不会引发try / catch,因此Sleep上的{{1}}似乎无关紧要。< / p>

来自MSDN

  

您可以通过中断等待线程   调用Thread.Interrupt   阻止线程抛出一个   ThreadInterruptedException,其中   将线程从阻塞中分离出来   呼叫。线程应该赶上   ThreadInterruptedException并且执行   什么是适当的继续   工作。如果线程忽略了   异常,运行时捕获   异常并停止线程。