我有Xamarin Android,Xamarin iOS和WPF项目的解决方案。
主要在ViewModels和数据访问组件中有很多多线程活动,我们在模型中使用INotifyDataErrorInfo,当然还有使用ObservableCollection列表的XAML DataBinding。
我需要的是所有平台的ObservableCollection实现,它将使列表并发,以确保只有一个线程可以修改集合。
在我的研究中,我发现了几个与我想要的最接近的实现,但是使用了可移植类库中没有的Thread和反射。 http://pastebin.com/hKQi6EHD。我想修改和abs
可以使我走上正轨的任何来源?
答案 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);
}
}