0

これを試すとエラーメッセージが表示されます:

Task.Factory
    .StartNew(() => _model.GetItems(node).Select(n => n))
    .ContinueWith(t =>
    {
        if (t.Result != null)
        {
            ObservableCollection<ItemValue> children = new ObservableCollection<ItemValue>(t.Result);                                
            //fill some control
        }
    }, TaskScheduler.FromCurrentSynchronizationContext());

エラー

依存オブジェクトと同じスレッドに依存ソースを作成する必要があります

しかし、このコードを試してみると:

Task.Factory
    .StartNew(() => _model.GetItems(node).Select(n => n))
    .ContinueWith(t =>
    {
        if (t.Result != null)
        {
            ObservableCollection<ItemValue> children = _model.GetItems(node);                                
            //fill some control
        }
    }, TaskScheduler.FromCurrentSynchronizationContext());

大丈夫です、エラーはありません。

私は何を間違っていますか?

別のスレッドでコレクションを埋めたいです。

4

1 に答える 1

0

他のスレッドで作成された UI 要素のプロパティをスレッドに強制的に変更させるには、UI 要素のDispatcherプロパティを使用する必要があります: http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherobject。ディスパッチャ (v=vs.110).aspx

簡単に書くことができます:

Task.Factory.StartNew(async () =>
                {
                    ObservableCollection<ItemValue> children = new ObservableCollection<ItemValue>(await _model.Dispatcher.InvokeAsync<IEnumerable<ItemValue>>(() => _model.GetItems(node)));
                    // fill some control
                });
于 2014-07-21T10:35:00.610 に答える