gpt4 book ai didi

c# - 在 Dispatcher.Invoke 语句中抛出异常时,Dispatchers UnhandledException 处理程序未处理异常

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:42 25 4
gpt4 key购买 nike

我对 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 不为空,但异常并未在 myDispatcherInstance 函数中结束,而是仅在域异常处理程序中“捕获” :

AppDomain.CurrentDomain.UnhandledException += UnhandledDomainExceptionHandler;

或者可能是 Dispatcher.CurrentDispatcher.UnhandledExceptionhandler 是正确的,但由于另一个原因,域异常处理程序被触发并且简单的调度程序异常处理程序在这种情况下不会触发?如果有,原因是什么?

最佳答案

经过一番研究,我发现实例确实是一样的。因此,在同一线程上访问 Dispatcher.CurrentDispatcher 时,您总是会得到相同的实例。

使调度程序 UnhandledException 事件触发的修复不是使用 Invoke,而是使用 BeginInvoke。对于我未知的原因,在使用调度程序 Invoke 执行的操作/委托(delegate)中抛出异常将无法由调度程序 UnhandledException 事件处理程序处理。

编辑

BeginInvoke 的解决方案是:

Action exception = () =>
{
throw new Exception("myExceptionText");
};
myDispatcherInstance.BeginInvoke(exception);

关于c# - 在 Dispatcher.Invoke 语句中抛出异常时,Dispatchers UnhandledException 处理程序未处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34001314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com