2010-07-22 162 views
6
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運行。線程可能會因此而中斷,因此,異常ThreadInterruptedException可能會在finally塊中拋出,對吧?我是否必須再次將試塊封入試塊中?如何正確處理ThreadInterruptedException?

謝謝!

+0

處理它的最好方法是不導致它。不要使用異常來更改線程的流量控制。使用良好的交叉線程信號,例如'ManualResetEvent'。 – 2010-07-22 21:29:01

回答

7

通過手動呼叫Thread.Interrupt中斷線程時拋出線程中斷異常。 Windows本身不會使用該方法中斷你的線程。通常這將是你的程序在控制線程何時發送中斷信號(不是所有的時間)。由於中斷信號可以用於某些流量控制,因此它通常不會連續發送兩次。

ThreadInterruptedException在被中斷的線程中拋出,但直到線程阻塞。如果線程永遠不會被阻塞,那麼這個異常永遠不會被拋出,因此線程可能完成而不會中斷。

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

保護你的線程,你應該是可以接受的。不要忘記,ThreadAbortException也可以被拋出,而且它們更普遍,並且可以更頻繁地拋出(應用程序正在關閉等)。

+0

說到'ThreadAbortException',在應用程序域卸載場景中不會出現'Dispatcher.Invoke'死鎖? – 2010-07-22 21:28:09