2015-11-05 3 views
0

У меня есть решение с Xamarin Android, Xamarin iOS и проектами WPF.Concurrent ObservableCollection в портативной библиотеке классов

Существует много многопоточных операций, главным образом, в компонентах ViewModels и доступа к данным, мы используем INotifyDataErrorInfo в нашей модели и, конечно, XAML DataBinding с списками ObservableCollection.

Что мне нужно, это реализация ObservableCollection для всех платформ, которые сделают список параллельным, чтобы убедиться, что только один поток может изменять коллекцию.

В моих исследованиях я нашел пару реализаций, которые ближе всего к тому, что я хочу, но использует Thread и reflection, которые недоступны в портативной библиотеке классов. http://pastebin.com/hKQi6EHD. Я думаю, что модификация и абс

Есть ли источники, которые могут получить меня на правильном пути?

+0

На самом деле, 'ObservableCollection' должны жить только в потоке пользовательского интерфейса (из-за привязки создавать новые' UIElement's для новых элементов). Однако, возможно, новые версии Framework могут решить эту проблему. Тем не менее, не помогло бы, если бы вы делегировали каждое изменение «ObservableCollection» 'Dispatcher' в поток пользовательского интерфейса? – JeffRSon

+0

Правда, я считаю, что это настоящая проблема, а не параллелизм. Сейчас я изучаю его глубже. –

ответ

0

Я наткнулся на эту же проблему при работе над подобной проблемой. Я могу использовать два возможных решения: 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 = правда сигнализации, что у нас уже есть обновление в работах.

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

Это определенно поможет, если у вас что-то покажет нам. –

Смежные вопросы