gpt4 book ai didi

c# - 我可以用另一个线程检测挂起的进程并从中恢复吗?

转载 作者:行者123 更新时间:2023-11-30 16:15:37 25 4
gpt4 key购买 nike

我有一个偶尔会挂起的方法(在我无法修改但必须使用的 dll 中)。如果我再次运行它,它通常会正常工作。我想知道是否可以创建一个等待 20 分钟然后在我的程序中抛出异常的后台线程。

var triesLeft = 5;
while (triesLeft > 0) {
try {
var t = new Thread(() => { wait(20 minutes); throw new ApplicationHungException();})
t.Start();
Object o = MethodThatHangsForever10PercentOfTheTime();
} catch (ApplicationHungException e) {
triesLeft--;
}
}
t.Abort();

这不起作用,因为异常不会传递到它所在的 try catch block 。有没有办法让线程将它的异常传递给 try catch block ?

最佳答案

实现此目的的一种方法是在单独的线程中触发错误方法,然后等待两种情况之一发生;要么:

  • 线程完成,或者
  • 经过预定的时间(例如 20 分钟)

一旦发生其中任何一种情况,我们就可以采取适当的措施。

代码看起来像这样:

static void DoProcessing() {
var triesLeft = 5;
Object o = null;

while (triesLeft > 0) {
var t = new Thread(() => { o = MethodThatHangsForever10%OfTheTime(); }).Start();
if (t.Join(new TimeSpan(0, 20, 0))) {
// The thread completed
break;
} else {
// We're out of time.
t.Abort(); // Important: See comments below about this
triesLeft--;
}
}
}

正如 Reed Copsey 在下面的评论中所指出的,事实证明,中止线程是一项有风险且脆弱的操作。您的替代方案是让挂起的线程在其余下的生命周期中存活下来(无论可能有多长),或者将 Heisenbuggy 方法调用隔离到一个单独的进程。

然而,这会打开另一个蠕虫 jar 头,因为您将不得不处理进程间通信、数据序列化和同步。这可能值得也可能不值得,这是我留给你的判断。

关于c# - 我可以用另一个线程检测挂起的进程并从中恢复吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19328590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com