DispatchersUnhandledException处理程序在Dispatcher.Invoke语句中引发异常时未
本文关键字:异常 语句 程序 处理 Dispatcher Invoke DispatchersUnhandledException | 更新日期: 2023-09-27 18:25:01
我有一个关于Dispatcher.CurrentDispatcher
静态属性的问题。如果我的理解是正确的,那么这个属性应该返回与线程相关联的调度器。我想如果我在同一个线程上调用Dispatcher.CurrentDispatcher
两次,我会收到同一个Dispatcher实例。这是真的吗?
我问这个问题是因为我遇到了以下问题。在我的(巨大的)应用程序启动时,我在主线程上注册了一个Dispatcher异常处理程序,如下所示:
Dispatcher.CurrentDispatcher.UnhandledException += UnhandledDispatcherExceptionHandler;
稍后在另一个线程上,我尝试抛出一个异常,如下所示:
Action exception = () =>
{
throw new Exception("myExceptionText");
};
myDispatcherInstance.Invoke(exception);
其中,我已经从主线程内将myDispatcherInstance
设置为myDispatcherInstance
,但从代码中另一个稍后执行的点设置。
因此,我的问题是,我从Dispatcher.CurrentDispatcher
收到的实例是否与我最初收到的实例不同。在调试器中,我看到myDispatcherInstance.UnhandledException
不为null,但异常并没有出现在myDispatcherInstance
函数中,而是仅在域异常处理程序中"捕获"
AppDomain.CurrentDomain.UnhandledException += UnhandledDomainExceptionHandler;
或者可能是Dispatcher.CurrentDispatcher.UnhandledExceptionhandler
是正确的,但由于另一个原因,域异常处理程序被触发,而在这种情况下,调度程序异常处理程序simple不会触发?如果是,原因是什么?
经过一些研究,我发现这个实例确实是一样的。因此,当在同一个线程上访问Dispatcher.CurrentDispatcher
时,您总是得到相同的实例。
使调度程序UnhandledException
事件激发的修复方法不是使用Invoke
而是使用BeginInvoke
。由于一个未知的原因,在使用调度器Invoke
执行的操作/委托中引发的异常将无法由调度器UnhandledException
事件处理程序处理。
编辑
BeginInvoke
的解决方案是:
Action exception = () =>
{
throw new Exception("myExceptionText");
};
myDispatcherInstance.BeginInvoke(exception);