我有一個線程: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)文件的內容。一個理想的解決方案。)
殺死一個線程並不是一個好主意,因爲它不釋放資源。我建議使用一些維護的.NET組件,它沒有這樣的錯誤,並且可以獲得支持。 – 2011-04-06 04:48:47
此外,一般來說,不要開始自己的線程。 http://stackoverflow.com/questions/684640/advantage-of-using-thread-start-vs-queueuserworkitem – Cheeso 2011-04-09 09:10:22