在Control.Invoke()之后无法获得异常回调

时间:2012-12-05 12:06:34

标签: c# .net multithreading exception-handling

我有2个帖子。 Thread-1,具有UserControl和Thread-2,具有委托方法。在线程2中,

i)我需要在Thread-1上调用委托。

ii)根据是否发生任何异常,执行一些额外的逻辑

这就是我在做的事情。在Thread-1中,在创建控件之前,我已经注册了一个回调

Application.ThreadException += MyUIExceptionHandler(); 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

问题-1: 现在,在Thread-2中,当我调用thread1Control.BeginInvoke(myDelegateMethod, args)时,我确实得到了MyUIExceptionHandler()关于异常发生的回调,但由于Control.BeginInvoke是异步的,我不知道等待多长时间在我执行上述步骤ii)之前。调用Thread.Sleep(5000)后,一个简单的BeginInvoke()为我完成了工作,应该以我知道的方式完成。但实现这一目标的另一个替代方案是什么? PS:我无法通过UserControl方面做任何通知,因为我无法控制该代码!

问题-2: 如果我使用同步调用的thread1Control.Invoke(myDelegateMethod, args)似乎完全适合该法案,但是当有异常时我不会回调MyUIExceptionHandler()。在这种情况下,为什么我没有收到回电?

1 个答案:

答案 0 :(得分:1)

Control.BeginInvoke()是一种即发即弃的方法。由于您的线程已移至其他位置,甚至可能不再运行,因此在UI线程上引发了目标引发的任何异常。

Control.Invoke()是一个fire-and-wait-until-done方法。您的工作线程将被阻止,直到目标执行完毕。由于只有在对结果感兴趣时才使用该方法,因此目标引发的任何异常都会在您的工作线程上重新引发。如果你想保持程序运行,你必须抓住它。