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)文件的内容。这将是一个理想的解决方案。

c#如何终止一个被阻塞的线程

如果你打算用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();做的伎俩?