2009-01-13 132 views
0

我試圖收集.NET進程或線程終止原因的完整列表,即使main()方法由try ... catch子句守護。什麼會導致.NET進程/線程意外終止?

一個這樣的原因是Thread.Abort()(除非你調用Thread.ResetAbort)。你知道更多的原因嗎?

回答

0

也許在你的線程中發生了一個未處理的異常,以殺死線程結束;在主線程中有一個try catch子句不會捕獲另一個正在運行的線程的異常。

編輯: 在讀/寫共用字段

0

網絡連接超時的一些併發訪問。

停電。

用戶正在查詢有問題的進程。

4

StackOverflowException不能由您的代碼處理。

當您有一個無限循環時,通常會出現StackOverflowException異常,這會導致您的調用堆棧增長到超過通常的堆棧大小(1MB)。

還有更多的例外,你不能從中恢復。 ExecutionEngineException似乎是其中之一。

+0

我最近不得不解決一個國有企業造成其消耗的IIS的256K堆棧限制〜248K第三方的DLL,就像當它不是無限循環 – annakata 2009-01-13 09:21:25

1

與C/C++不同,main()並不完全是您的應用程序。因此,即使用try/catch塊包圍main()中的所有代碼也不會捕獲該代碼生成的所有異常。

但是,您可以通過監聽Application.ThreadException事件附加一個函數來處理整個應用程序拋出的未處理的異常,這將幫助您捕獲應用程序中任何線程的異常,無論它是由您的代碼創建的還是不。

例如,您的代碼可能會調用外部非託管DLL中的代碼。該代碼可能會執行自己的線程,這可能會異步失敗,從而導致引發異常。該例外屬於您的應用程序的過程,但不屬於您的任何代碼。如果未被捕獲,將導致您的程序意外終止。