我有一个Windows服务,在抛出未处理的ThreadInteruptedException时偶尔会崩溃并停止。此服务的主要功能是每x分钟(用户定义的时间跨度)运行同步。我只使用过两次Thread.Interrupt()方法(因为我知道它有多乱) -
客户端可以通过TCP连接进行连接,但如果数据发送到客户端的速度太快而无法处理,则可以向服务发送“暂停”信号,然后全部恢复数据已被处理(这些可能是无线设备,并且可能有多个客户端以不同的速度运行,所以我不想在TCP缓冲区中留下任何这些)。暂停然后将线程置于休眠状态,并继续中断此操作并继续。
当TCP连接最初连接时,另一种用途是类似的情况。
但是,我已经让这个服务运行了,即使我没有连接任何客户端也会抛出此异常!没有TCP连接,因此没有达到这些中断方法!我已经把try语句放在服务中的每个Thread.Sleep()周围捕获这个异常,但是仍然会引发这个异常!
我确定我错过了一些非常明显的东西,但它并没有向我跳出来,我一直在寻找好几天!
提前致谢
答案 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并且执行 什么是适当的继续 工作。如果线程忽略了 异常,运行时捕获 异常并停止线程。