2010-03-15 130 views
5

我的應用程序中有一個線程正在運行可能導致調用堆棧損壞的代碼(我的應用程序是dll的測試工具)。如何終止已調用堆棧損壞的.NET線程?

假設我有一個檢測子線程是否行爲不正常的方法,我將如何終止它?從我讀的內容來看,在行爲不端的線程上調用Thread.Abort()將等同於在其中引發異常。我擔心這不是一個好主意,只要線程的調用堆棧可能已損壞。任何建議?

+0

您需要重寫代碼,因爲這絕不應該發生。 – ChaosPandion 2010-03-15 19:35:33

+1

正如我所說的,我正在嘗試製作一個測試工具,所以我必須假設我正在測試的任何dll函數都有潛在危險。 – 2010-03-15 19:37:08

+1

再次,我的閱讀理解失敗了。我很抱歉。 – ChaosPandion 2010-03-15 19:38:04

回答

6

如果您正在運行不可信的代碼,可能會破壞您的進程在單獨的進程中運行該代碼並使用進程間通信與其進行通信。如果你想盡早終止不受信任的代碼,你可以殺死這個進程。

+1

突然間,我有那首Monzy歌曲「Kill dash nine」卡在我的頭上。 – 2010-03-15 19:51:27

+0

http://www.monzy.com/intro/killdashnine_lyrics.html – 2010-03-16 02:37:09

3

如果代碼行爲不端,它可以做任何事情,它可以在整個過程中有什麼影響,在任何線程。

最可靠的解決方案是在不同的進程中運行不受信任的代碼,然後終止進程,如果它不正常。

+0

查殺總是這樣做。運行它你自己的線程將是冒險的,而且不可靠,這要歸功於可能不可信任的終結器,它可以清楚地表明任何事情...... – luckyluke 2010-03-15 19:42:56

3

加載DLL到一個新的AppDomain,並從那裏使用AppDomain.DoCallBack方法運行在DLL的代碼。

0

除了接受的答案,我想補充說,忽略Thread.Abort是非常容易的。

try 
{ 
    ... 
} 
catch (ThreadAbortException) 
{ 
    Thread.ResetAbort(); 
}