可移植类库中的并发可观测集合
本文关键字:可观 集合 并发 类库 可移植 | 更新日期: 2023-09-27 18:20:44
我有一个Xamarin Android、Xamarin iOS和WPF项目的解决方案。
主要在ViewModels和数据访问组件中有很多多线程活动,我们在模型中使用INotifyDataErrorInfo,当然还有带有ObservableCollection列表的XAML DataBinding。
我需要的是所有平台的ObservableCollection实现,它将使列表并发,以确保只有一个线程可以修改集合。
在我的研究中,我发现了两个实现,其中一个最接近我想要的,但使用了可移植类库中没有的线程和反射。http://pastebin.com/hKQi6EHD.我想修改和abs
有什么可以让我走上正轨的消息来源吗?
我在处理类似问题时偶然发现了同样的问题。我最多可以提出两种可能的解决方案,一种是为您的存储库使用并发集合,另一种是使用facade来更新可观察的集合。2创建您自己的ConcurrentObservable集合。2有风险,因为您需要正确同步,否则会影响性能。我的想法是,您可以包装ConcurrentCollection,然后实现INotifyPropertyChanged。我认为应该在引发事件之前进行散列或某种类型的有效比较。您也可以创建自己的INotifyPropertyChangedAsync事件。只是我的想法。
适配器:
ConcurrentQueue _concurrentQueue = new ConcurrentQueue<object>();
Add(object o)
{
_concurrentQueue.Enqueue(o);
if (!_updateStatus)
{
Task.Run(() => UpdateBindingCollection()).ConfigureAwait(true);
}
}
在UpdateBindingCollection的输入_updateStatus=true时,表示我们已经在进行更新。
void UpdateBindingCollection()
{
while (_concurrentQueue.Count > 0)
{
object o;
_concurrentQueue.Dequeue(out o);
_observableCollection.Add(o);
}
}
更容易但阻止:
Lock(_observableCollection)
{
//Perform update either with add or range.
}