我对Dispatcher.CurrentDispatcher
静态属性有疑问。如果我的理解是正确的,则此属性应返回与该线程关联的调度程序。我想如果我在同一个线程上调用Dispatcher.CurrentDispatcher
两次,我会收到相同的Dispatcher实例。这是真的吗?
我问这个问题,因为我遇到过以下情况。在我的(巨大的)应用程序启动时,我在主线程上注册一个Dispatcher异常处理程序,如下所示:
Dispatcher.CurrentDispatcher.UnhandledException += UnhandledDispatcherExceptionHandler;
后来在另一个线程上,我试图抛出这样的异常:
Action exception = () =>
{
throw new Exception("myExceptionText");
};
myDispatcherInstance.Invoke(exception);
我已经从主线程中将myDispatcherInstance
设置为myDispatcherInstance
,但是从代码中的另一个但稍后执行的点设置。{/ p>
所以我的问题是,我从Dispatcher.CurrentDispatcher
收到的实例是否可能与我最初收到的实例不同。在调试器中,我看到myDispatcherInstance.UnhandledException
不是null,但是异常不会在myDispatcherInstance
函数中结束,而只会被捕获'在域异常处理程序中:
AppDomain.CurrentDomain.UnhandledException += UnhandledDomainExceptionHandler;
或者可能是Dispatcher.CurrentDispatcher.UnhandledExceptionhandler
是正确的,但由于另一个原因,触发了域异常处理程序,并且在这种情况下,调度程序异常处理程序简单不会触发?如果是这样,原因是什么?
答案 0 :(得分:1)
Dispatcher.CurrentDispatcher
时,您始终会获得相同的实例。
使调度程序UnhandledException
事件触发的修复程序不是使用Invoke
而是使用BeginInvoke
。对于一个尚未知的原因,调度程序Invoke
执行的操作/委托中抛出的异常将无法由调度程序UnhandledException
事件处理程序处理。
修改强>
BeginInvoke
的解决方案是:
Action exception = () =>
{
throw new Exception("myExceptionText");
};
myDispatcherInstance.BeginInvoke(exception);