gpt4 book ai didi

c# - 不能使用与其父 Freezable 属于不同线程的 DependencyObject - prism

转载 作者:行者123 更新时间:2023-11-30 12:12:47 28 4
gpt4 key购买 nike

我在开发 WPF 应用程序时遇到了一个问题。该应用程序基于 Prism。应用程序使用 prism bootstraper 和在加载任何窗口之前,应用程序会在不同的线程 (STA) 上打开一个模式对话框,然后加载了一堆东西(服务等)该对话框在此期间打开,并允许通知用户应用程序启动过程的进度(使用事件聚合器传递更新)。加载完成后, Bootstrap 关闭对话框并打开主应用程序窗口。到目前为止一切顺利...然后当关闭应用程序时,同样的事情正在发生。主窗口关闭,打开一个对话框(再次在新的 STA 线程上),以允许通知。但是现在,当点击 ShowDialog 调用时(发生在新的 STA 线程中),引发异常:“不能使用与其父 Freezable 属于不同线程的 DependencyObject”。经过长时间的调试,我发现异常的原因是窗口的背景,它是从应用程序级别的合并字典中获取的画笔/图像(在 wpf UI 线程上实例化)。如果在没有 ResouceDictionary 的情况下加载图像 - 一切顺利。


总结:只有在使用 resourceDictionary 并且仅在第二次调用新的 STA 线程时才会观察到异常,该线程又会加载 DialogBox 并在调用 ShowDialog 时恰好引发异常如果只有一个对话框(例如开机时没有对话框,关机过程中只有对话框),则不会发生异常。


那么我的问题是:这是什么原因?在这种情况下,这个异常到底意味着什么?(我知道一般来说其他线程会有某种 UI 线程更新,但后来我不明白为什么这只发生在 dialgo+thread 的第二个实例上)。

谢谢:)

最佳答案

正如您正确提到的,您的背景对象是在主 UI 线程上创建的。您的背景实际上是一个 Brush 对象,而 Brush 是一个 DependencyObject。

创建 DependencyObject 时,它“依赖于”创建它的 STA 线程。所以像其他依赖对象一样,它只能在它自己的线程上使用。这意味着 STA 和对旧 COM 对象模型的某种兼容性。

因此,当您尝试在其他 STA 线程上使用它时,您会得到一个适当的异常。

P.S 我对已定义为资源的图像有同样的问题。

关于c# - 不能使用与其父 Freezable 属于不同线程的 DependencyObject - prism,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12905486/

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