2014-03-27 87 views
3

我已經繼承了一些服務代碼,我試圖找出服務崩潰的問題。我發現下面的代碼在很多地方:.NET運行時是否調用過Thread.Abort()?

catch (ThreadAbortException) 
{ 
    throw; 
} 

但是,我無法找到該項目(或相關項目)的任何部分Thread.Abort()Thread.Kill()任何來電。

是否曾經隱式地由.NET運行時調用Thread.Abort(),或者該異常是否只存在於開發人員所做的調用中?我試圖縮小我的錯誤途徑,並且我對C#中的線程不太熟練。我試圖確定我所展示的catch塊是否實際命中,如果Thread.Abort()實際上從未在我的代碼庫中實際調用過。

謝謝!

編輯:我想澄清 - 我知道,.NET可以殺死線程,但我想知道,如果它特別呼籲Thread.Abort(),或者是否使用了一些其他方式(如ThreadAbortException只呼籲Thread.Abort()

+6

是的,運行時會中止線程。這些是*粗暴*中止,在AppDomain卸載時觸發,它們不會觸發該代碼。避免假設之前的程序員知道他在做什麼或者正確清理了他的代碼。畢竟,他也許認爲這不是一個好主意。事實並非如此。 –

回答

2

。捕捉/拋出沒有關於它似乎毫無意義的做任何事情。

這些錯誤是常見的ASP.NET--就意味着結束了響應,例如重定向。ASP.NET Response.Redirect() Error

,或者它意味着工作進程被殺死casinni/iis/aspnet爲它自己的神祕原因,也許工人進程回收等。

它通常不表示編程錯誤。

在多線程應用程序中調用Thread.Abort()在大多數情況下似乎不是一個好主意,所以在SO上的其他答案對我來說可以說比我更好。

+0

如果線程被中止並拋出異常.....異常將通過調用堆棧冒泡,對吧?線程之間是否有異常 - 它會傳播到父線程嗎? –

+0

很少見到這些將它們寫入錯誤日誌(收集在全局asax的錯誤處理程序中)以及開發機器上,在這些機器上經常會執行一些不尋常的事情,比如殺死casinni進程,殺死iis或者其他嚴重的關閉。 – MatthewMartin

+0

有趣的是:http://referencesource.microsoft.com/#mscorlib/system/threading/threadabortexception.cs#1b47a5a85e0d5883 ThreadAbortException意味着一個線程死亡/故意中止。 – MatthewMartin

0

編輯:我想澄清 - 我知道,.NET可以殺死線程,但我 想,如果它特別呼籲Thread.Abort的(),還是使用 一些其他手段(如ThreadAbortException只呼籲 Thread.Abort的()。

如果你是它的是,請參閱.NET Reference Source真的有興趣,看看是否(以及何處),這是非常完整的。具體來說,它表明Thread.Abortthese places引用。

相關問題