0

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

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

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

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

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

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

问题 2: 如果我使用thread1Control.Invoke(myDelegateMethod, args)which is a synchronous call 似乎完全符合要求,但是当出现异常时,我不会回调到MyUIExceptionHandler(). 为什么在这种情况下我没有收到回调?

4

1 回答 1

1

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

Control.Invoke() 是一种触发并等待直到完成的方法。您的工作线程被阻塞,直到目标完成执行。由于您仅在对结果感兴趣时才使用该方法,因此目标引发的任何异常都会在您的工作线程上重新引发。如果你想保持程序运行,你必须抓住它。

于 2012-12-05T17:43:14.057 回答