我正在尝试加载我们活动目录中的所有用户并将它们显示在 ListBox 中。但是,如果我像往常一样这样做,我会长时间冻结 UI 线程。那么无论如何我可以使用一个任务在后台线程上填充这个集合,同时在我插入新名称时仍然让列表框更新?
问问题
1897 次
1 回答
2
由于您无法在单独的线程(或任务,等等)中加载所有数据然后填充 ObservableCollection,因此您可以将当前 Dispatcher 传递给操作并使用其 InvokeAsync 方法将元素一一添加到 Observable 集合中用户界面线程。像这样的东西:
public void FetchAndLoad()
{
// Called from the UI, run in the ThreadPool
Task.Factory.StartNew( () =>
this.FetchAsync(e => this.Dispatcher.InvokeAsync(
() => this.observableCollection.Add(e)
)
));
}
public void Fetch(Action<string> addDelegate)
{
// Dummy operation
var list = new List<string>("Element1", "Element2");
foreach (var item in list)
addDelegate(item);
}
不过,我会分批执行此操作,具体取决于元素的数量。
于 2012-11-21T20:18:10.920 回答