C# 将UI线程上的多个异步操作分组

C# 将UI线程上的多个异步操作分组,c#,.net,wpf,task-parallel-library,c#-5.0,C#,.net,Wpf,Task Parallel Library,C# 5.0,我有这个: BusyState.SetBusy("Updating Calendar Data"); Dispatcher.CurrentDispatcher.Invoke(new Action(async () => { // calling "update" will hit servers outside my control and may take time await PublicCalendars.Update(); await PrivateCal

我有这个:

BusyState.SetBusy("Updating Calendar Data");

Dispatcher.CurrentDispatcher.Invoke(new Action(async () =>
{
    // calling "update" will hit servers outside my control and may take time
    await PublicCalendars.Update();
    await PrivateCalendars.Update();

    // clearing the busy state should only happen when both update tasks are finished
    BusyState.ClearBusy();
}));
vars PublicCalendars和PrivateCalendars都在扩展ObservableCollection,并在调用update期间填充。集合绑定到某些WPF GUI,因此必须从UI线程添加项


我想删除等待,让两个电话同时运行。当两个任务都完成时,我如何才能做到这一点,并且仍然保持忙碌状态?

任务的优点是它们可以轻松组合。因此,如果您想获得一个表示两个
任务完成情况的
任务
,可以使用一种方法:

通过保存返回的
任务
s,然后
等待它们,您自己也可以获得非常类似的行为:

var publicTask = PublicCalendars.Update();
var privateTask = PrivateCalendars.Update();

await publicTask;
await privateTask;

BusyState.ClearBusy();

Task
s的优势在于它们可以轻松组合。因此,如果您想获得一个表示两个
任务完成情况的
任务
,可以使用一种方法:

通过保存返回的
任务
s,然后
等待它们,您自己也可以获得非常类似的行为:

var publicTask = PublicCalendars.Update();
var privateTask = PrivateCalendars.Update();

await publicTask;
await privateTask;

BusyState.ClearBusy();

顺便说一句,我认为这里不需要
Dispatcher.CurrentDispatcher.Invoke()
。如果
CurrentDispatcher
返回正确的dispatcher,则表示您在UI线程上,这意味着您可以直接调用所有方法。顺便说一句,我认为这里不需要
dispatcher.CurrentDispatcher.Invoke()
。如果
CurrentDispatcher
返回正确的dispatcher,则表示您在UI线程上,这意味着您可以直接调用所有方法。