【发布时间】:2010-09-28 05:14:13
【问题描述】:
我在视图中有一个数据网格,它绑定到视图模型中的列表。我有很多数据要检索列表,所以我想将其分解为许多小检索而不是一个大检索。
我希望这发生在后台线程上,并在检索到的每个批次结束时更新 UI(网格绑定新数据)。
在每次检索结束时,我在私有支持者上执行 List.AddRange(),然后引发 OnPropertyChanged 事件,传递网格绑定到的公共属性的名称。
最初我尝试了 6 次迭代,每次迭代检索 100 个项目。在后台运行时,UI 会在前 100 个之后更新,但不会更新最后 500 个(即使数据已成功添加到视图模型中的底层列表)。
考虑到我在编组到 UI 线程时遇到了一些问题,我同步运行它,期望它按预期工作(尽管在每次检索期间阻塞 UI)或在所有检索期间阻塞 UI - 但在任何一种情况下,最后更新以显示 600 项。但是,它最终会执行与我在后台运行时相同的操作 - 仅更新前 100 个,而不更新其余部分。
以下是我在两次尝试中使用的方法,上半部分是背景版本被注释掉。
我做错了什么?
public void StartDataStream()
{
//Task<List<Car>> task = _taskFactory.StartNew(this._retrieveData);
//task.ContinueWith(t =>
//{
// if (this._cars == null) this._cars = new List<Car>();
// this._cars.AddRange(t.Result);
// base.OnPropertyChanged("Cars");
// this.iterations += 1;
// if (iterations < 6) StartDataStream();
//});
if (this._cars == null) this._cars = new List<Car>();
this._cars.AddRange(this.GetCarList(eq,s,e));
base.OnPropertyChanged("Cars");
this.iterations += 1;
if (iterations < 6) StartDataStream();
}
【问题讨论】: