在某些类中,我想使用 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.
为什么这不起作用,以及如何在完成这两个任务后运行继续任务,而不阻塞当前线程?
代替:
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
to the 最外层任务。在您的原始代码中,您正在分配loadData1
的结果ContinueWith
,这是其他事情(第二个任务,以便您可以等待或从second task).
注意:如果你想等待内部任务,你应该捕获内部任务的结果ContinueWith
调用一个新变量,然后等待that.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)