2011-04-07 32 views
0

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

客户端可以通过TCP连接进行连接,但是如果数据发送到客户端的速度太快为了解决这个问题,它可以发送一个“暂停”信号回服务,然后在所有数据处理完毕后恢复(这可能是无线设备,可能有多个客户端以不同的速度运行,所以我没有想在TCP缓冲区中留下任何这一点)。暂停然后使线程进入休眠状态,然后继续中断并继续。

另一种用途是在TCP连接最初连接时出现类似的情况。

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

我确定我错过了一些非常明显的事情,但它只是不跳出来,我一直在寻找几天!

  1. 有没有人遇到过这个 之前?
  2. 没有人有任何便宜 替代睡眠和 中断线程(不 而(暂停)继续;)
  3. 有谁知道的 调试未处理的异常 这样一个简单的方法?我什至不能看到 堆栈来找出这是从哪里来的 !
  4. 其他方法可以抛出ThreadInterruptedException吗?或者是否有其他方法会导致睡眠线程中断?

在此先感谢

+3

TIE不会从天而降。通过删除Interrupt()调用并将其替换为Auto/ManualResetEvent.Set()来改进您的代码。 – 2011-04-07 11:55:25

+0

伟大的提示汉斯,没有更多的错误!谢谢 – Connell 2011-04-14 13:10:06

回答

0

对于阅读此内容的任何人。我接受的答案是Hans Passant的评论。此解决方案工作得很好,摆脱了任何ThreadInterruptedExceptions

TIE不从天上掉下来。通过删除Interrupt()调用并将其替换为Auto/ManualResetEvent.Set()来改进您的代码。

0

我看不出异常正在从甚至调用的方法提高。

此外,ThreadInteruptedException不被Sleep方法提出,而是由Interupt方法 - 所以try/catchSleep似乎这里无关紧要。

MSDN

您可以通过调用 在了Thread.interrupt阻塞 线程中断等待线程抛出 ThreadInterruptedException,这 断了线的阻挡 通话。该线程应抓住 ThreadInterruptedException并做 任何适合继续 工作。如果线程忽略 异常,运行时将捕获异常并停止该线程。

+0

我不确定在这里应该使用什么术语,但是我认为从另一个线程调用myThread.Interrupt会导致ThreadThreadException异常被myThread上的Thread.Sleep方法抛出。这似乎是有道理的,但是我完全误解了这个概念吗? – Connell 2011-04-07 10:11:09