У меня есть приложение UWP, в котором одна из страниц должна выполнить три задачи - первая - это загрузить основной контент для страницы (набор объектов 'Binders', полученный из нашего API), затем после этого загрузить какую-то другуюсодержимое, которое никак не зависит от первой задачи.
Моя страница поддерживается моделью ViewModel (я использую модель Template10
MVVM по умолчанию), и при переходе на страницу выполняется это вметод VM OnNavigatedToAsync
:
public async override Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> state)
{
if (mode == NavigationMode.New || mode == NavigationMode.Refresh)
{
IsBusy = true; //Show progress ring
CreateServices(); //Create API service
//Download binders for board and populate ObservableCollection<Binder>
//This has a cover image and other info I want to show in the UI immediately
await PopulateBinders();
//Get files and calendar events for board
//Here I want to run this on a different thread so it does
//not stop UI from updating when PopulateBinders() is finished
await Task.WhenAll(new[]
{
PopulateBoardFiles(),
PopulateBoardEvents()
});
IsBusy = false;
await base.OnNavigatedToAsync(parameter, mode, state);
return;
}
}
Итак, основная задача - PopulateBinders()
- она вызывает API, возвращает данные и загружает их в ObservableCollection of Binder.После этого я хочу, чтобы пользовательский интерфейс обновил свои привязки и немедленно показал объекты Binder, но вместо этого он ждет, пока две другие задачи в WhenAll
Task) запустятся, прежде чем обновлять пользовательский интерфейс.(Все эти три задачи определены как private async Task<bool>...
)
Я понимаю, что мне здесь не хватает чего-то базового - но я подумал, что вызов Task из асинхронного метода позволит обновить пользовательский интерфейс?Поскольку это явно не позволяет мне сделать рефакторинг для обновления привязок моей страницы после первого метода?
Я пытался Task.Run(() => PopulateBinders());
, но это не имело никакого значения.