最近,我必须在我的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?
答案 0 :(得分:1)
ObservableCollection本身并不是线程安全的。但是,可以从非UI线程更改ViewModel属性(其中的ObservableCollections),因为UI视图本身的代码更新属性将在UI线程上运行。 Xamarin将自己处理它。尝试使用线程安全的ObservableCollection。