Я использую NavigationManager.LocationChanged
для захвата строк запроса. После получения значения строки запроса я делаю вызов ajax, который является asyn c. LocationChanged сам по себе является синхронным методом, и похоже, что не существует asyn c версии LocationChanged
. И при вызове метода asyn c изнутри LocationChanged значение, установленное методом asyn c, отстает на один шаг.
Вот его воспроизведение:
@page "/investigate"
@implements IDisposable
@inject NavigationManager NM
<h1>Sync: @SyncValue</h1>
<h1>Async: @AsyncValue</h1>
<button @onclick="TriggerLocationChange">Increment</button>
@code {
private string SyncValue;
private string AsyncValue;
private int Counter = 1;
protected override void OnInitialized()
{
NM.LocationChanged += OnLocationChanged;
}
public void Dispose()
{
NM.LocationChanged -= OnLocationChanged;
}
private void OnLocationChanged(object sender, LocationChangedEventArgs args)
{
// sync action, just for comparison
SyncValue = (Counter * 1000).ToString();
DoSomeAsync();
}
private async Task DoSomeAsync()
{
// http call to server
await Task.Delay(1);
AsyncValue = (Counter * 1000).ToString();
}
private void TriggerLocationChange()
{
Counter++;
NM.NavigateTo("investigate?counter=" + Counter);
}
}
The @AsyncValue
отстает на один шаг от @SyncValue
.
Как я могу предотвратить отставание метода asyn c при вызове изнутри LocationChanged?