可移植类库中的并发ObservableCollection
问题描述:
我有Xamarin Android,Xamarin iOS和WPF项目的解决方案。可移植类库中的并发ObservableCollection
主要在ViewModels和数据访问组件中有很多多线程活动,我们在模型中使用INotifyDataErrorInfo,当然还有使用ObservableCollection列表的XAML DataBinding。
我需要的是所有的平台,这将使列表并发,以确保只有一个线程可以修改该集合一个ObservableCollection实现。
在我的研究,我发现夫妇实现这一个最接近我想要的,但使用线程和反思是不是在便携式类库提供。 http://pastebin.com/hKQi6EHD。我猜修改和ABS
可让我在正确的轨道任何来源?
答
我上一个问题类似工作时无意中发现了同样的问题。我可以用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.
}
事实上,'ObservableCollection'应该只生活在UI线程(因为绑定的创建新项目新的'UIElement's)。但是,较新的Framework版本似乎可以解决这个限制。然而,如果你将'Dispatcher'的'ObservableCollection'的每一次改变委托给UI线程,它会不会有帮助? – JeffRSon
的确,我相信这是真正的问题,而不是并发性。我现在正在深入研究它。 –