2012-01-14 160 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