我正在尝试加载活动目录中的所有用户并将它们显示在ListBox中。但是,如果我这样做,我会冻结UI线程很长一段时间。那么无论如何我可以使用任务在后台线程上填充此集合,同时在插入新名称时仍然让列表框更新?
答案 0 :(得分:2)
由于无法在单独的线程(或任务,无论如何)中加载所有数据然后填充ObservableCollection,您可以将当前的Dispatcher传递给操作并使用其InvokeAsync方法将元素逐个添加到Observable UI线程中的集合。像这样:
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);
}
我会分批进行,具体取决于元素的数量。