可以在挂起的线程上调用thread.abort()挂起主线程吗?

时间:2014-02-05 18:44:48

标签: c#

我有一个外部库,我的代码调用它有时会永久挂起(但仅限于生产!)。我将挂起的部分放入一个单独的线程,所以我可以杀死它并再次尝试使用以下内容超时,但它在调用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时挂起?

1 个答案:

答案 0 :(得分:1)

Per MSDN,如果您调用abort,则无法保证线程将结束。我也是半正面的Abort()将阻塞,直到实际引发异常。但是,我可能会弄错。

我建议您查看文档here。在处理线程时,你可以从中收集一些东西。

然而,正如Servy所说,你最好不要使用Abort。我的意见相同。