2011-04-07 31 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