2015-11-05 93 views
0

我有Xamarin Android,Xamarin iOS和WPF项目的解决方案。可移植类库中的并发ObservableCollection

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

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

在我的研究,我发现夫妇实现这一个最接近我想要的,但使用线程和反思是不是在便携式类库提供。 http://pastebin.com/hKQi6EHD。我猜修改和ABS

可让我在正确的轨道任何来源?

+0

事实上,'ObservableCollection'应该只生活在UI线程(因为绑定的创建新项目新的'UIElement's)。但是,较新的Framework版本似乎可以解决这个限制。然而,如果你将'Dispatcher'的'ObservableCollection'的每一次改变委托给UI线程,它会不会有帮助? – JeffRSon

+0

的确,我相信这是真正的问题,而不是并发性。我现在正在深入研究它。 –

回答

0

我上一个问题类似工作时无意中发现了同样的问题。我可以用2个可能的解决方案,1使用一个并发集合为您的存储库和一个门面来更新可观察集合。 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. 
} 
+0

我相信这些都是解决问题的最佳选择。 –

+0

我可以添加一些代码,如何从观察者模式更新一个,如果这将有所帮助? – Kentonbmax

+0

它肯定会有帮助,如果你有东西给我们看。 –