mbursill
mbursill

Reputation: 3151

Group multiple async operations on the UI thread

I have this:

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();
}));

The vars PublicCalendars and PrivateCalendars are both extending ObservableCollection and are populated during the call to update. The collections are bound to some WPF GUI so adding items must happen from the UI thread.

I'd like to remove the await's and let both calls run simultaneously. How can I do this and still have my busy state clear when both tasks are finished?

Upvotes: 1

Views: 312

Answers (1)

svick
svick

Reputation: 244817

The strength of Tasks is that they can be easily composed. So, if you want to get a Task that represents the completion of both Tasks, you can use a method that does that: Task.WhenAll():

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

BusyState.ClearBusy();

And you could also get a very similar behavior by yourself by saving the returned Tasks and then awaiting them:

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

await publicTask;
await privateTask;

BusyState.ClearBusy();

Upvotes: 1

Related Questions