【发布时间】: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#