3

Active Directoryにすべてのユーザーをロードし、リストボックスに表示しようとしています。ただし、これを通常のように行うと、UIスレッドが長時間フリーズします。それで、とにかく、新しい名前を挿入するときにリストボックスを更新しながら、タスクを使用してこのコレクションをバックグラウンドスレッドで埋めることができますか?

4

1 に答える 1

2

すべてのデータを別のスレッド(またはタスクなど)にロードしてからObservableCollectionに入力することはできないため、現在のDispatcherを操作に渡し、そのInvokeAsyncメソッドを使用して、要素を1つずつ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);
    }

ただし、要素の数によっては、バッチで実行します。

于 2012-11-21T20:18:10.920 に答える