【问题标题】:can calling thread.abort() on a hung thread hang the main thread?可以在挂起的线程上调用 thread.abort() 挂起主线程吗?
【发布时间】:2014-02-06 22:22:41
【问题描述】:

我有一个外部库,我的代码调用它有时会永远挂起(但仅在生产中!)。我将挂起的部分放入一个单独的线程中,这样我就可以杀死它并在超时时使用以下命令重试,但在调用 abort 时它似乎挂起:

var triesLeft = 5;
while (triesLeft > 0) 
{
    var mre = new ManualResetEvent(false);

    var t = new Thread(_ => {
                           MethodThatHangsForever10PercentOfTheTime();
                           mre.Set();
                     });
    t.start();

    if (mre.WaitOne(TimeSpan.FromMinutes(20)))
    {
          break; // Success!
    }
    triesLeft--;

    log("this prints once");
    t.abort();
    log("this never prints");
  }
}

在调用 abort 时,生成的线程是否可能导致主线程挂起?

【问题讨论】:

  • 不要使用Abort。对于任何给定问题,它几乎总是错误的解决方案。
  • @Servy - 那么,推荐的解决方案是什么?
  • 嗯,理想的解决方案是使用在 10% 的时间内不会自行中断的代码。将自己置于一个非常可怕的位置。要么向库施加压力以修复其代码,联系他们的支持以查看您是否只是在不正确地使用它,或者找到一种方法来避免使用像这样行为不端的损坏的库方法。
  • 您能否将您的代码移动到 IIS 托管的 wcf 服务中?然后,您可以获得自动回收和 IIS 提供的所有其他故障安全解决方案。
  • 使用有缺陷的第三方库,有时将其移至另一个进程,并使用一些进程间通信方式(如 WCF)与它通信是个好主意。当库函数挂起时,只需终止并重新启动进程即可。

标签: c#


【解决方案1】:

根据MSDN,如果您调用 abort,则无法保证线程将结束。我也是半积极的 Abort() 将阻止直到实际引发异常。但是,我可能弄错了。

我建议您查看文档here。在处理线程时,您可能可以从中收集到一些信息。

但是,正如 Servy 所说,您最好不要使用 Abort。我也是这么认为的。

【讨论】:

  • 我也有同样的看法。 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 2019-07-27
  • 2017-04-09
  • 2012-04-18
  • 2014-09-15
  • 1970-01-01
相关资源
最近更新 更多