C#如何杀死被阻塞的线程?

Ozz*_*zah 2 c# zip multithreading gzip block

我有一个帖子:

void threadCode(object o)
{
  doStuffHere(o); // Blocking call. Sometimes hangs.
}
Run Code Online (Sandbox Code Playgroud)

而我这样称呼它:

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)
}
Run Code Online (Sandbox Code Playgroud)

我正在使用.NET Zip Library并且调用ZipFile.CommitUpdate()大部分时间都可以工作,但有时只是挂起.我不知道为什么,我在文档中看不到任何指示为什么会发生这种情况的内容.一个不超过5-10秒的小文件有时会在那里停留超过5分钟但没有进展.进程资源管理器中的I/O图表显示该进程不是读取或写入,并且没有CPU使用情况.基本上,如果发生这种情况,我想CommitUpdate()在放弃之前杀死并再试一次或两次.

知道如何杀死阻塞调用中的线程吗?

(或者 - 那些有这个zip库经验的人:你知道为什么有时会挂起一些文件吗?我正在修改.docx和.pptx(GZip)文件的内容.这将是一个理想的解决方案. )

Bra*_*ith 8

如果您要通过使用终止挂起线程Thread.Abort(),请确保您ThreadAbortException在线程代码中处理.正常的模式是:

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

如果你不遵循上面的模式,那么你的线程最多会不合时宜地终止.在最坏的情况下,您可能会遇到其他一些问题.


SLa*_*aks 5

你可以打电话Thread.Abort给血腥谋杀线程.

线程将无法自行清理(finally块除外); 取决于它当时正在做什么,它可能会严重搞乱你的程序.