2012-01-14 99 views
5

後,在某些類我想加載2集異步地工作,並停止BusyIndi​​cator控件繼續任務的所有任務完成

我嘗試這樣

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.

爲什麼這不起作用,如何在完成這兩項任務後運行繼續任務,而不阻塞當前線程?

+0

哪一行引發異常? – 2012-01-14 20:00:14

+0

這裏的任務loadData1和loadData2有什麼關係嗎? – Tudor 2012-01-14 20:01:01

+0

查看編輯文章@ChrisShain – 2012-01-14 20:01:49

回答

15

相反的:

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最外層任務。在您的原始代碼中,您正在分配loadData1ContinueWith的結果,這是其他任務(第二項任務,以便您可以等待或繼續執行第二個任務)。

注意:如果您想等待內部任務,您應該將ContinueWith調用的結果捕獲到一個新變量中,並且等待

+0

啊,謝謝Marc!你完全正確!我將調用更改爲Task.Factory.Start,它會自動啓動第一個任務,並且效果非常好 – 2012-01-14 20:17:24