2015-11-05 102 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

它肯定會有幫助,如果你有東西給我們看。 –