C# ObservableCollection异步项未添加
我目前有一个可观的收集:C# ObservableCollection异步项未添加,c#,wpf,multithreading,xaml,C#,Wpf,Multithreading,Xaml,我目前有一个可观的收集: private readonly object _outputCollectionLock = new object(); private ObservableCollection<ChatterOutput> _outputs; public ObservableCollection<ChatterOutput> Outputs { get { return _outputs; } set { _ou
private readonly object _outputCollectionLock = new object();
private ObservableCollection<ChatterOutput> _outputs;
public ObservableCollection<ChatterOutput> Outputs
{
get { return _outputs; }
set
{
_outputs = value;
BindingOperations.EnableCollectionSynchronization(_outputs, _outputCollectionLock);
}
}
在锁后设置的任何断点中,我都可以看到新项被添加到集合中。然而,若我在不同的时间设置断点,我会发现并没有添加新元素
我尝试在Application.Current.Dispatcher上调用它,但这并没有改变任何事情。使用这些集合的唯一其他东西是XAML绑定,即Mode=OneWay
这是线程问题,还是我完全遗漏了什么
谢谢这里的问题来自将元素传递给多个类。 当我将输出从一个类传递到另一个类,然后使用线程化事件处理程序时,这些类变得独立,因此修改集合并不是修改正确的集合 为了解决这个问题,如果要多线程处理,请在构造函数中找到传递类的解决方法。我的解决方案是单一模式
感谢评论中的所有人。您能告诉我们您是如何尝试使用dispatcher的吗?对于ObservableCollection还有一件事,您不能将它与XAML.wrap中的CollectionViewSource一起使用,因为它会在Dispatcher.BeginInvoke调用中添加调用。首先,请删除BindingOperations.EnableCollectionSynchronization\u outputCollectionLock;并将其转换为ViewModel的构造函数。我用Task试过你的代码,效果很好。
lock (_outputCollectionLock)
{
Outputs.Add(new ChatterOutput{Option = option});
}