Xamarin表单:是否应始终在UI线程中设置/更新ObservableCollection?

时间:2016-09-04 19:18:52

标签: mvvm xamarin.forms observablecollection ui-thread

最近,我必须在我的PCL ListView上实现无限滚动/延迟加载。我将遗漏大部分代码,但最重要的部分是:

视图模型

   var countries = // get countries
   foreach (var country in countries)
   {
        // Countries is an ObservableCollection<Country> 
        Countries.Add(country);
   }

这似乎在Android上运行良好,但在iOS上,我不断超出范围异常,特别是当我快速滚动列表时。对我来说,修复是在主UI线程中运行此代码。

// wrap the code with this
Device.BeginInvokeOnMainThread(async () => {});

我现在的问题是,所有查看更新或设置可观察集合的模型服务调用是否应始终在UI线程中执行?

我有几个设置 Countries的命令。没有UI线程块,它们似乎工作正常。我只遇到了添加项目的问题,如上所示。

是否应始终在UI线程中设置和更新ObservableCollection?

1 个答案:

答案 0 :(得分:1)

ObservableCollection本身并不是线程安全的。但是,可以从非UI线程更改ViewModel属性(其中的ObservableCollections),因为UI视图本身的代码更新属性将在UI线程上运行。 Xamarin将自己处理它。尝试使用线程安全的ObservableCollection