Основываясь на вашем комментарии к ответу @ enet, один из возможных ответов заключается в том, что ваша страница загрузки списка никогда не прерывает logi c загрузки списка, освобождая его от потока пользовательского интерфейса, поэтому, по сути, все по-прежнему работает синхронно. Если это так, есть 2 простых способа обойти это.
Метод 1
Вы можете использовать переопределение OnInitializedAsync
для загрузки списка при загрузке страницы. Важная часть состоит в том, что вам нужно сделать что-то в методе перед загрузкой вашего списка, что заставит среду выполнения построить продолжение задачи и вернуть управление потоку пользовательского интерфейса, и Task.Delay();
отлично работает. Итак, ваш метод выглядит примерно так:
protected override async Task OnInitializedAsync()
{
// await the delay, breaks the UI thread free from following logic
await Task.Delay(1);
// Populate your list with a background task that you await
// Assumes you already have the list initialized and just need values
ListValues = await Someservice.GetListValuesAsync();
// You may not need this call, but if so you might need to invoke it async
// Doing so will synchronize back to the UI thread
await InvokeAsync(StateHasChanged);
}
Метод 2
Вы можете использовать переопределение OnAfterRenderAsync
для загрузки данных. Ключевым моментом здесь является то, что вы устанавливаете начальное состояние пользовательского интерфейса для отображения компонента загрузки в качестве действия по умолчанию, а затем используете такой метод:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
ListValues = await Someservice.GetListValuesAsync();
// Since you awaited the list population, now you can update UI
MethodToSwitchUiToListView();
// this may be needed as well
await InvokeAsync(StateHasChanged);
}
}
Я предпочитаю использовать метод 2 вместо метода 1, поскольку он позволяет мне создавать пользовательский интерфейс, который очень просто представлять состояние загрузки, а затем загружать несколько разделов параллельно и переключать пользовательский интерфейс по мере того, как данные становятся доступными. Во-вторых, в Blazor Server (который, похоже, не относится к вашему случаю) метод OnInitializedAsyn c вызывается дважды, но OnAfterRender вызывается только один раз. В любом случае должен работать.
Дайте мне знать, если это поможет.
PS - Метод NavigationManager.NavigateTo()
также принимает необязательный второй параметр в качестве логического, чтобы принудительно загрузить страницу. Если установлено значение true
, выполняется принудительная перезагрузка и обновление sh. Я рекомендую поэкспериментировать с этим, если вы еще этого не сделали, так как это может быть полезно вернуться на текущую страницу. Примером могут служить такие вещи, как сброс сложных форм, когда имеет смысл начать все сначала, а не пытаться полностью изменить состояние, и у меня было несколько разочаровывающих обстоятельств, которые были решены с помощью этого простого второго параметра. Этот может также помочь в вашем случае.