可移植类库中的并发可观测集合

本文关键字:可观 集合 并发 类库 可移植 | 更新日期: 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. 
}