【问题标题】:ObservableCollection Asynchronous Items Not AddingObservableCollection 异步项未添加
【发布时间】:2025-12-08 13:50:01
【问题描述】:

我目前有一个 ObservableCollection:

private readonly object _outputCollectionLock = new object();
private ObservableCollection<ChatterOutput> _outputs;
public ObservableCollection<ChatterOutput> Outputs
{
    get { return _outputs; }
    set 
    { 
        _outputs = value; 
        BindingOperations.EnableCollectionSynchronization(_outputs, _outputCollectionLock); 
    }
}

问题是由我的一个事件处理程序引起的。当调度事件处理程序时,我正在添加一个新对象,如下所示:

lock (_outputCollectionLock)
{
    Outputs.Add(new ChatterOutput{Option = option});
}

在锁定后设置的任何断点中,我都可以看到新项目被添加到集合中。但是,如果我在不同的时间断点,我发现没有添加任何新元素。

我尝试在Application.Current.Dispatcher 上调用它,但这并没有改变任何东西。使用这些集合的唯一其他东西是 XAML 绑定,即Mode=OneWay

这是线程问题,还是我完全遗漏了什么?

谢谢

【问题讨论】:

  • 您能告诉我们您是如何尝试使用调度程序的吗?对于ObservableCollection 还有一件事,您不能在 XAML 中将它与CollectionViewSource 一起使用。
  • 将 Add 调用包装在 Dispatcher.BeginInvoke 调用中。
  • 首先删除BindingOperations.EnableCollectionSynchronization(_outputs, _outputCollectionLock); 并将其转移到ViewModel 的构造函数中。我使用 Task 尝试了您的代码,效果很好。

标签: c# wpf multithreading xaml


【解决方案1】:

这里的问题来自于将元素传递给多个类。 当我将输出从一个类传递到另一个类,然后使用线程事件处理程序时,这些类变得独立,因此修改集合并没有修改正确的集合。

为了解决这个问题,如果您要多线程,请找到在构造函数中传递类的解决方法。我的解决方案是单例模式。

感谢 cmets 的每一个人。

【讨论】: