在多线程UI WPF应用程序中使用实时可视树时,出现“调用线程无法访问该对象”异常

最大限度

我有WPF应用程序,其中两个窗口在不同的线程上运行(每个窗口都有其自己的线程)。第一个窗口基本上是一个初始屏幕,第二个是我的应用程序的主界面。

当我经常使用Live Visual Tree(选择某些元素)或Live Property Explorer(搜索属性)时,会出现“调用线程无法访问此对象”的异常。在某些调试会话中,我将完全不会遇到此异常。

我的猜测是,Live Visual Tree和Live Property Explorer以某种方式使用我的UI线程之一来获取它们使用的信息。如果他们尝试使用第一个窗口的线程(启动画面)来访问在第二个线程上创建的可视元素,我将得到一个例外。

有人可以帮我吗?

并且,请不要建议对UI使用一个线程。

编辑:

我发现当我检查具有某些绑定的ui元素时,最有可能发生此异常。也就是说,当Live Visual Tree或Live Property Explorer尝试访问数据上下文对象而不仅仅是检查ui元素的任何属性时,就会发生异常。

最大限度

我找到了解决此问题的方法:

您需要在应用程序中的某个位置订阅以下事件:

Application.Current.DispatcherUnhandledException += CurrentOnDispatcherUnhandledException;

CurrentOnDispatcherUnhandledException的主体可以是这样的:

private void CurrentOnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        e.Handled = true;

        if (Debugger.IsAttached
            && (e.Exception?.InnerException?.StackTrace.Contains("System.Windows.Threading.Dispatcher.VerifyAccess()") ?? false)
            && (e.Exception?.InnerException?.StackTrace.Contains("Microsoft.XamlDiagnostics.WpfTap.WpfVisualTreeService.TypeServices.TypeService.GetProperties(Object target)") ?? false))
        {
            Debug.WriteLine(e.Exception.InnerException.Message);
        }
        else
            ShowExceptionMessage(e.Exception);
    }

ShowExceptionMessage在这里并不重要,它可以是您喜欢的任何错误处理程序,或者甚至可以摆脱它(我不建议这样做)。

另外,您可以检查e.Exception?.InnerException?.Message。我没有在此包括此检查,因为消息将是特定于语言的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章