2011-03-22 60 views
3

我正在測試一些錯誤處理代碼,並試圖確保我的應用程序和數據總是失敗到一致的狀態。我已經驗證了代碼以「正常」注入錯誤的方式工作,但我想更進一步。停止.NET線程的最不優雅的方式是什麼?

什麼是最簡單的殺死.NET線程的方式,讓錯誤處理儘可能少地做到這一點?

想一想,例如,如何測試CLR約束執行區域的限制?或者,我會如何模擬像拔出插頭一樣嚴重的事情?

+10

將它從軌道上剔除。 – Jimmy 2011-03-22 16:12:19

+12

拔下電腦。 – 2011-03-22 16:12:52

+1

@John Rasch就像拋出異常一樣實用,我必須承認,少數場景與直接電源故障一樣戲劇性。 – CodexArcanum 2011-03-22 16:16:26

回答

3

您可以調用/調用TerminateThread windows API函數。但是,這很可能會破壞程序中的非託管狀態,包括CLR本身的狀態。所以在這樣做之後,你的過程處於一個未定義的狀態,這可能是殺死整個過程的好主意。

+0

偉大的想法,嚴重錯誤的完美例子。 – JasonRShaver 2011-03-22 16:31:08

1

你可以使用Thread.Abort。這將強制在該線程上拋出ThreadAbortedException。

最有力的方式,缺乏切割能力當然是要殺死任務管理器的過程。

2

如果你有一個線程的句柄,你可以調用Thread.Abort(); 這會在被調用的線程上拋出一個ThreadAbortedException。

+0

我已經得到了那麼多,但如果系統內存不足,它不能實例化ThreadAbortedException?我將如何模擬這個級別的東西? – JasonRShaver 2011-03-22 16:15:42

+0

這將執行'finally'子句,所以它不是真的突然。甚至可能根本不會終止線程。 – CodesInChaos 2011-03-22 16:17:21

+0

如果你內存不足,你很快就會崩潰..:)在此之後你就無能爲力了 – 2011-03-22 16:17:38

6

導致堆棧溢出異常 - 無法捕捉。只需編寫一個自稱的函數。

+0

我喜歡它,那是非常嚴肅的。任何想法如何將其注入到另一個線程? – JasonRShaver 2011-03-22 16:22:03

+0

你的意思是,*注入*?線程從調用委託開始,代碼從那裏繼續。你需要編寫線程,以便在某個時刻調用無限遞歸。 – 2011-03-22 16:28:09

0

Thread.Abort被認爲是邪惡的。其中一種可能的方法是獲得工人和調用者都可見的volatile布爾值(來源:http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation

+1

我想他想要一些邪惡的東西來測試他的程序如何處理它。 – CodesInChaos 2011-03-22 16:20:10

+0

我還將添加Thread.Abort可以導致C#中的內存鏈接的提示,這正是我感興趣的測試內容。 – JasonRShaver 2011-03-22 16:23:36

1

唯一不會終止整個過程可以防止捕獲並最終阻止執行的方法是通過禁止TerminateThread()。這是一個有問題的功能,只能在測試場景中使用。它泄漏爲堆棧分配的內存。你也很難得到你需要的線程句柄。這需要pinvoking GetCurrentThread(),必須從線程本身內部完成。

在此之後,測試程序的狀態是隨機的,很像使用Thread.Abort()時的情況。好吧,更糟。

相關問題