【发布时间】: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