可移植类库中的并发ObservableCollection

时间:2015-11-05 13:11:14

标签: c# wpf multithreading xamarin observablecollection

我有Xamarin Android,Xamarin iOS和WPF项目的解决方案。

主要在ViewModels和数据访问组件中有很多多线程活动,我们在模型中使用INotifyDataErrorInfo,当然还有使用ObservableCollection列表的XAML DataBinding。

我需要的是所有平台的ObservableCollection实现,它将使列表并发,以确保只有一个线程可以修改集合。

在我的研究中,我发现了几个与我想要的最接近的实现,但是使用了可移植类库中没有的Thread和反射。 http://pastebin.com/hKQi6EHD。我想修改和abs

可以使我走上正轨的任何来源?

1 个答案:

答案 0 :(得分:0)

在处理类似问题时,我偶然发现了同样的问题。我可以使用2种可能的解决方案,1使用存储库的并发集合和更新可观察集合的Facade。 2创建自己的ConcurrentObservable集合。 2是有风险的,因为您需要使同步正确或它将影响性能。我的想法是你可以包装ConcurrentCollection然后实现INotifyPropertyChanged。在提出事件之前,我认为应该进行哈希或某种类型的有效比较。您还可以创建自己的INotifyPropertyChangedAsync事件。只是我的想法。

适配器:

var url = window.location.href.toString();
var newString = url.substr(url.lastIndexOf(".") + 1));

输入UpdateBindingCollection _updateStatus = true表示我们已经在进行更新。

ConcurrentQueue _concurrentQueue = new ConcurrentQueue<object>();

Add(object o)
{
     _concurrentQueue.Enqueue(o);
     if (!_updateStatus)
        {
            Task.Run(() => UpdateBindingCollection()).ConfigureAwait(true); 
        }
}

更容易但阻止:

void UpdateBindingCollection()
    {
        while (_concurrentQueue.Count > 0)
        {
            object o;
            _concurrentQueue.Dequeue(out o);
            _observableCollection.Add(o);
        }
    }
相关问题