c# - 使用任务加载 ObservableCollection<string>

标签 c# task-parallel-library

我试图加载我们事件目录中的所有用户并将它们显示在列表框中。但是,如果我像往常一样这样做,我会长时间卡住 UI 线程。那么无论如何我可以使用一个任务在后台线程上填充这个集合,同时在我插入新名称时仍然让列表框更新吗?

最佳答案

因为你不能在一个单独的线程(或任务,等等)中加载所有数据然后填充 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);
    }

不过,我会根据元素的数量分批进行。

关于c# - 使用任务加载 ObservableCollection<string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501064/

相关文章:

c# - 如何从 Fortran dll 调用 C# 代码

c# - task.Wait 抛出异常

c# - 用于执行的队列多线程方法

c# - TPL 异步等待 - 异步任务是否必须链接调用堆栈?

c# - 如何实现惰性 TaskCompletionSource?

c# - 乌姆布拉科。在控制台应用程序中获取节点的 url

c# - 如何编写这个 Regex 表达式?

c# - Linq 选择查询,如何将结果附加到类的对象

c# - 想要使用XAML资源文件更改窗口颜色

c# - 从定义数量的文件中进行并行读取