Продолжить задание после завершения всех заданий - PullRequest
5 голосов
/ 14 января 2012

В каком-то классе я хочу загрузить 2 коллекции асинхронно с помощью Task и остановить busyindicator

Я пытаюсь что-то вроде этого

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
WaitingIndicatorViewModel.IsBusy = true;
var loadData1 = new Task<ObservableCollection<Data1>>(GetData1FromService).ContinueWith(t => Data1Collection = t.Result, uiScheduler);
var loadData2 = new Task<ObservableCollection<Data2>>(GetData2FromService).ContinueWith(t => Data2Collection = t.Result, uiScheduler);

Task.Factory.StartNew(() =>{
                loadData1.Start();//<--Exception here           
                loadData2.Start();
                Task.WaitAll(loadData1, loadData2);
        })
.ContinueWith(o => WaitingIndicatorViewModel.IsBusy = false, uiScheduler);

Но это выдает исключение InvalidOperationException:Start may not be called on a continuation task.

Почему это не работает, и как я могу запустить задачу продолжения после завершения обеих задач, не блокируя текущий поток?

1 Ответ

15 голосов
/ 15 января 2012

Вместо:

var loadData1 = new Task<ObservableCollection<Data1>>(GetData1FromService)
               .ContinueWith(t => Data1Collection = t.Result, uiScheduler);

Я думаю, что вы имеете в виду:

var loadData1 = new Task<ObservableCollection<Data1>>(GetData1FromService);
loadData1.ContinueWith(t => Data1Collection = t.Result, uiScheduler);

Теперь вы можете (позже) позвонить:

loadData1.Start();

Разница в том, что мы присваиваем loadData1 самой внешней задаче . В исходном коде вы присваиваете loadData1 результат ContinueWith, что является чем-то другим (вторая задача, так что вы можете ждать или продолжить выполнение задачи second ).

Примечание: если вы хотите дождаться выполнения внутренней задачи, вы должны записать результат вызова ContinueWith в новую переменную и подождать , что .

...