2011-04-06 162 views
1

我有一個線程:C#如何殺死一個阻塞的線程?

void threadCode(object o) 
{ 
    doStuffHere(o); // Blocking call. Sometimes hangs. 
} 

,我稱它是這樣的:

Thread t = new Thread(new ThreadStart(delegate() 
    { 
    threadCode(o); 
    })); 
t.Start(); 

StopWatch sw = new StopWatch(); 
sw.Start(); 

while (t.IsAlive) 
{ 
    Application.DoEvents(); 

    if (sw.EllapsedMilliseconds > myTimeout) 
    // Somehow kill t even though doStuffHere(o) is blocked (but hung) 
} 

我使用的是.NET Zip Library,並呼籲ZipFile.CommitUpdate()其工作的大部分時間,但有時只是掛起。我不知道爲什麼,我在文檔中看不到任何指出爲什麼發生這種情況的內容。一個不超過5 - 10秒的小文件有時會在那裏停留5分鐘以上,沒有進展。進程管理器中的I/O圖表顯示該進程不是讀或寫操作,並且沒有CPU使用率。基本上,如果發生這種情況,我想殺了CommitUpdate()並在放棄之前再試一次或兩次。

任何想法如何我可以殺死阻塞呼叫中的線程? (或者 - 你有這個zip庫的經驗的人:你知道爲什麼它有時候會掛上一些文件嗎?我正在修改.docx和.pptx(GZip)文件的內容。一個理想的解決方案。)

+0

殺死一個線程並不是一個好主意,因爲它不釋放資源。我建議使用一些維護的.NET組件,它沒有這樣的錯誤,並且可以獲得支持。 – 2011-04-06 04:48:47

+0

此外,一般來說,不要開始自己的線程。 http://stackoverflow.com/questions/684640/advantage-of-using-thread-start-vs-queueuserworkitem – Cheeso 2011-04-09 09:10:22

回答

4

你可以致電Thread.Abort來殺死線程。

線程本身無法清理(finally塊除外);具體取決於當時正在做的事情,這可能會嚴重影響您的計劃。

2

替代使用秒錶,你可以這樣做:

Thread thread = new Thread(new ThreadStart(delegate() 
{ 
    threadCode(o); 
})); 
thread.Start(); 

thread.Join(myTimeout); 
if(thread.IsAlive) 
{ 
    thread.Abort(); 
} 
+0

我不認爲這會很簡單。我現在要試一試。我以爲線程。Abort()只是發送一個信號給線程放棄,這會觸發線程中的事件處理程序。 – Ozzah 2011-04-06 02:38:11

+1

@Ozzah:不;這是做到這一點的安全方法。 'Abort'是_dangerous_。 – SLaks 2011-04-06 02:38:47

+0

@SLaks雖然[MSDN](http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx)說'調用這個方法**通常**終止線程。我想知道這意味着什麼。 – 2011-04-06 02:40:38

0

我自己沒有這樣做過,所以我不確定這個,但t.Abort();是否有訣竅?

6

如果您打算使用Thread.Abort()來終止懸掛線程,請確保您在線程代碼中處理ThreadAbortException。正常模式是:

try { 
    // do work here 
} 
catch (ThreadAbortException) { 
    // allows your thread to gracefully terminate 
    Thread.ResetAbort(); 
} 
catch { 
    // regular exception handling 
} 

如果你不遵循上面的模式,那麼最好你的線程將非正常終止。最糟糕的是,你可能會遇到其他一些問題。

2

不要使用Thread.Abort()來解決您正在使用的庫中的錯誤。 (或者它可能是你的代碼中的一個錯誤)。

要麼修復原始錯誤,要麼移動到不同的庫。

ps:你可能想嘗試DotNetZip,而不是SharpZipLib。