c#如何终止一个被阻塞的线程
本文关键字:线程 一个 何终止 终止 | 更新日期: 2023-09-27 17:48:59
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库并调用ZipFile.CommitUpdate()
,这在大多数时候都有效,但有时只是挂起。我不知道为什么,我在文档中看不到任何说明为什么会发生这种情况的内容。一个不应该超过5 - 10秒的小文件有时会在那里停留超过5分钟,没有任何进展。进程资源管理器中的I/O图显示进程没有读写,也没有CPU使用情况。基本上,如果发生这种情况,我想杀死CommitUpdate()
并在放弃之前再尝试一两次。
知道我如何杀死一个线程卡在阻塞调用吗?
(或者-那些使用过这个zip库的人:你知道为什么它有时会与一些文件一起挂起吗?我正在修改。docx和。pptx (GZip)文件的内容。这将是一个理想的解决方案。
如果你打算用Thread.Abort()
来终止挂起的线程,确保你在线程代码中处理了ThreadAbortException
。正常模式为:
try {
// do work here
}
catch (ThreadAbortException) {
// allows your thread to gracefully terminate
Thread.ResetAbort();
}
catch {
// regular exception handling
}
如果你不遵循上面的模式,那么你的线程最多只能不优雅地终止。在最坏的情况下,您可能会遇到许多其他问题。
您可以调用Thread.Abort
来血腥地谋杀线程。
线程将无法清理自己(除了finally
块);
不要使用Thread.Abort()来解决你正在使用的库中的错误。(也可能是代码中的错误)。
要么修复原始错误,要么转移到不同的库。
ps:您可能想尝试DotNetZip,而不是SharpZipLib。
除了使用秒表,您还可以这样做:
Thread thread = new Thread(new ThreadStart(delegate()
{
threadCode(o);
}));
thread.Start();
thread.Join(myTimeout);
if(thread.IsAlive)
{
thread.Abort();
}
使用thread. abort()方法终止线程。详见http://msdn.microsoft.com/en-us/library/aa332365(VS.71).aspx
作为最后的手段,您可以使用Thread.Abort()
来终止线程-不要期望任何有序的关闭
我自己没有这样做,所以我不确定这一点,但t.Abort();
做的伎俩?