3

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

4

1 回答 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 回答