我有一个偶尔挂起的方法(在 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 块。有没有办法让线程将它的异常传递给 try catch 块?

最佳答案

您可以在单独的线程中完成您的工作,并等待 20 分钟使其完成:

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

    ThreadPool.QueueUserWorkItem(_ => {
                           MethodThatHangsForever10PercentOfTheTime();
                           mre.Set();
                     });

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

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

10-11 16:00