C# 加载一个可观察的集合<;字符串>;带着任务
我正在尝试加载active directory中的所有用户,并将其显示在列表框中。然而,如果我像平常一样这样做,我会在很长一段时间内冻结UI线程。那么,我是否可以使用任务在后台线程上填充此集合,同时在插入新名称时仍要更新列表框?因为您无法在单独的线程(或任务,无论什么)中加载所有数据,然后填充ObservableCollection,您可以将当前调度程序传递给操作,并使用其InvokeAsync方法将元素逐个添加到UI线程中的可观察集合中。大概是这样的:C# 加载一个可观察的集合<;字符串>;带着任务,c#,task-parallel-library,C#,Task Parallel Library,我正在尝试加载active directory中的所有用户,并将其显示在列表框中。然而,如果我像平常一样这样做,我会在很长一段时间内冻结UI线程。那么,我是否可以使用任务在后台线程上填充此集合,同时在插入新名称时仍要更新列表框?因为您无法在单独的线程(或任务,无论什么)中加载所有数据,然后填充ObservableCollection,您可以将当前调度程序传递给操作,并使用其InvokeAsync方法将元素逐个添加到UI线程中的可观察集合中。大概是这样的: public void FetchAnd
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);
}
public void FetchAndLoad()
{
//从UI调用,在线程池中运行
Task.Factory.StartNew(()=>
this.FetchAsync(e=>this.Dispatcher.InvokeAsync(
()=>this.observateCollection.Add(e)
)
));
}
公共无效获取(操作addDelegate)
{
//虚拟操作
var列表=新列表(“元素1”、“元素2”);
foreach(列表中的变量项)
添加代表(项目);
}
不过,我会根据元素的数量分批执行。这取决于数据的获取方式。为什么不使用
BackgroundWorker
?它会将所有用户加载到一个单独的线程上的集合中,完成后,您可以将集合项添加到OC中。这是我从DirectorySearcher创建的IEnumerable。我基本上循环了FindAll的结果,得到了samaccountname.Beautiful。非常感谢。是的,我已经有了一个扩展方法,可以为我划分序列。@twreid我很高兴它对你有用,但你甚至不给他所有工作的投票权?