使用Task </string>加载ObservableCollection <string>

时间:2012-11-21 19:55:50

标签: c# task-parallel-library

我正在尝试加载活动目录中的所有用户并将它们显示在ListBox中。但是,如果我这样做,我会冻结UI线程很长一段时间。那么无论如何我可以使用任务在后台线程上填充此集合,同时在插入新名称时仍然让列表框更新?

1 个答案:

答案 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);
    }

我会分批进行,具体取决于元素的数量。