在某些类中,我想与Task异步加载2个集合并停止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.
为什么这不起作用,如何在完成两个任务后运行继续任务,而不阻塞当前线程?
答案 0 :(得分: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();
不同之处在于我们正在为{strong> 最外层 任务分配loadData1
。在原始代码中,您要为loadData1
分配ContinueWith
的结果,这是其他内容(第二项任务,以便您可以等待或继续执行第二次任务)
注意:如果您想等待内部任务,您应该将ContinueWith
调用的结果捕获到一个新变量中,然后等待那个。