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

本文关键字:异步操作 UI 线程 | 更新日期: 2023-09-27 17:59:31

我有这个:

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 PublicCalendar和PrivateCalendar都在扩展ObservableCollection,并在调用更新时填充。集合绑定到一些WPF GUI,因此添加项目必须从UI线程进行。

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

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

Task s的优势在于它们可以很容易地组合。因此,如果你想得到一个代表两个Task完成的Task,你可以使用一个方法:Task.WhenAll():

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

您也可以通过保存返回的Task s和然后await来获得非常相似的行为:

var publicTask = PublicCalendars.Update();
var privateTask = PrivateCalendars.Update();
await publicTask;
await privateTask;
BusyState.ClearBusy();