在所有任务完成后继续任务

本文关键字:任务 继续 | 更新日期: 2023-09-27 18:20:14

在某些类中,我想与Task异步加载2个集合并停止busyinger

我试试这个

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.

为什么这不起作用,以及如何在完成两个任务后运行continue任务,而不阻塞当前线程?

在所有任务完成后继续任务

代替:

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分配给最外层任务。在原始代码中,您将ContinueWith的结果分配给loadData1,这是另一个任务(第二个任务,以便您可以等待或从第二个任务继续)。

注意:如果您想等待内部任务,您应该将ContinueWith调用的结果捕获到一个新变量中,并等待。