gpt4 book ai didi

c# - 在 UI 线程中修改 ObservableCollection 会导致错误,即使在使用 UI 调度程序时也是如此

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

我有一个在类级别声明的 ObservableCollection。这是自定义控件的集合。

private ObservableCollection<AssetCriticalDimensionItemDetail> _details;
private Dispatcher UIDispatcher;

调用一个方法,在 UI 线程上实例化一个新的 ObservableCollection。我此时也在设置 UI 调度程序。

此时在代码中,一切都是同步完成的。我捕获了线程 ID,以便在修改集合时可以比较它。

enter image description here

完成后,一些控件被添加到不同的集合,然后后台线程运行。后台线程完成后,用户可以在子控件中输入一些选项并单击“添加”。添加会触发一个事件,该事件会回调父控件并修改集合。

enter image description here

您可以从该图像中看到线程 ID 与 UI 线程相同,但它不允许我修改集合,即使它是在 UI 线程上创建的。所以我尝试调用 UIDspatcher.Invoke,但它仍然给我同样的错误。

这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。

最佳答案

听起来您可能在后台线程上创建控件,然后在主 UI 线程上显示它们。或者,在 UI 线程上创建的控件可能与在后台线程上创建的 Dispatcher 仿射对象交互。无论哪种情况,这都是您的问题:从 DispatcherObject 继承的任何对象都不可撤销地绑定(bind)到创建它的线程。

@MikeStrobel is that even possible? AFAIK controls check during creation if they are created on the UI thread

是的,就框架而言,不存在“UI 线程”这样的东西。理论上,您的应用程序可以有多个线程运行 WPF 调度程序。 DispatcherObject 的构造函数将其 Dispatcher 属性初始化为 Dispatcher.CurrentDispatcher,这会为当前线程创建一个 Dispatcher,如果一个尚不存在(尽管新创建的 Dispatcher,如果创建,实际上不会运行)。

关于c# - 在 UI 线程中修改 ObservableCollection 会导致错误,即使在使用 UI 调度程序时也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27299031/

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