在UI线程上对多个异步操作进行分组

时间:2013-02-15 01:03:53

标签: 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 PrivateCalendars.Update();

    // clearing the busy state should only happen when both update tasks are finished
    BusyState.ClearBusy();
}));

vars PublicCalendars和PrivateCalendars都在扩展ObservableCollection,并在调用更新期间填充。这些集合绑定到一些WPF GUI,因此必须从UI线程添加项目。

我想删除await,并让两个调用同时运行。我怎样才能完成这项工作,并在完成这两项任务后仍然保持忙碌状态?

1 个答案:

答案 0 :(得分:1)

Task s的优势在于它们可以轻松编写。因此,如果您想获得代表两个Task完成情况的Task,您可以使用这样做的方法:Task.WhenAll()

await Task.WhenAny(PublicCalendars.Update(), PrivateCalendars.Update());

BusyState.ClearBusy();

您还可以通过保存返回的Task然后 await来获得非常类似的行为:

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

await publicTask;
await privateTask;

BusyState.ClearBusy();