Dot-Net

如何正確處理 ThreadInterruptedException?

  • November 22, 2016
public void threadMethod() 
{
   try
   {
       // do something
   }    
   catch (ThreadInterruptedException e)
   {
       Console.WriteLine("[Net]", role, "Thread interrupted.");
       n.CloseConnection();
   }
   finally
   {
       if (isAutenticated == false)
       {
           n.CloseConnection();
       }

       Dispatcher.Invoke(addMessage, "Network connection searching was disabled.");
       DebuggerIX.WriteLine("[Net]", role, "Finished");
       Dispatcher.Invoke(threadStoppedDel);
   }
}

方法threadMethod通過System.Threading.Thread執行。執行緒可能會被中斷,因此可能會在 finally 塊中拋出異常*ThreadInterruptedException ,對嗎?*我是否必須再次將塊包含在 try-catch 中?

謝謝!

當執行緒被手動呼叫Thread.Interrupt中斷時,會引發執行緒中斷異常。Windows 本身不會使用該方法中斷您的執行緒。通常,您的程序將控制何時向執行緒發送中斷信號(並非一直如此)。由於中斷信號可用於某些流控制,因此通常不會快速連續發送兩次。

ThreadInterruptedException 在被中斷的執行緒中拋出,但直到執行緒阻塞。如果執行緒從不阻塞,則永遠不會拋出異常,因此執行緒可能會在不被中斷的情況下完成。

如果您的執行緒從不休眠或等待其他對象(進入 WaitSleepJoin 狀態),您將永遠不會看到拋出的異常。

保護你的執行緒應該是可以接受的。不要忘記也可以拋出 ThreadAbortException,並且這些異常稍微普遍並且可以更頻繁地拋出(應用程序正在關閉等)。

引用自:https://stackoverflow.com/questions/3313575