我有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()
。在这种情况下,为什么我没有收到回电?
答案 0 :(得分:1)
Control.BeginInvoke()是一种即发即弃的方法。由于您的线程已移至其他位置,甚至可能不再运行,因此在UI线程上引发了目标引发的任何异常。
Control.Invoke()是一个fire-and-wait-until-done方法。您的工作线程将被阻止,直到目标执行完毕。由于只有在对结果感兴趣时才使用该方法,因此目标引发的任何异常都会在您的工作线程上重新引发。如果你想保持程序运行,你必须抓住它。