对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线程进行。
我想删除等待,让两个调用同时运行。当两项任务都完成时,我如何才能做到这一点并保持忙碌状态?
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();