我再次想談談Thread.Abort
函數的安全性。我有興趣有一些方法可以放棄我實際上無法控制的操作,但我希望儘快釋放線程以防止線程對我的應用程序感到厭煩。.NET Thread.Abort再次
所以我寫了一些測試代碼,看看是否有可能使用Thread.Abort
並讓異常中止的線程清理資源。這裏是代碼:
int threadRunCount = 0;
int threadAbortCount = 0;
int threadFinallyCount = 0;
int iterations = 0;
while(true)
{
Thread t = new Thread(() =>
{
threadRunCount++;
try
{
Thread.Sleep(Random.Next(45, 55));
}
catch(ThreadAbortException)
{
threadAbortCount++;
}
finally
{
threadFinallyCount++;
}
});
t.Start();
Thread.Sleep(45);
t.Abort();
iterations++;
}
所以,到目前爲止,這個代碼工作約5分鐘,並threadRunCount
總是等於threadFinally
和threadAbort
在數量上有所回落,因爲一些線程完成,沒有中止或很可能在最後得到了中止。
所以問題是,我想念什麼?
我試圖運行代碼,您提到了文件打開,並且是在創建新線程之後的某個時間點文件仍然忙於另一個應該被中止的線程,但是如果線程不使用共享資源呢? 似乎它只是證明線程Abort有點不安全。 即使我只是需要終止應用程序無法中止導致處理掛起或一些內存泄漏,如果一些非託管代碼正在運行? 在我的情況下,我需要的東西可以限制進程運行時間到確切的超時限制,在我的情況下,我無法控制此進程的執行。對此案件的任何想法? – hoodoos 2010-01-18 11:20:37
您應該在SO上提出一個不同的問題,如何限制執行時間,然後在該代碼中發佈您打算執行的操作。在某些情況下,例如,如果代碼在非託管代碼中處於忙碌狀態,則無法做到您想要的操作。唯一的「安全」方法是產生一個在超時過後完全終止的子進程。 – 2010-01-18 11:24:47
小修正(即使這個答案已經過了一年) 線程不會在catch和finally塊內部放棄。所以假設一個寫得很好的finally塊或者使用塊,上面的例子並不是真正的問題。 – Steve 2011-05-16 04:58:58