我使用NavigationManager.LocationChanged捕获查询字符串。在获得查询字符串值之后,我将进行ajax调用,即异步调用。LocationChanged本身是同步方法,看起来没有异步版本的LocationChanged。当从LocationChanged内部调用异步方法时,异步方法设置的值落后了一步。
这是复制品:
@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);
}
}@AsyncValue比@SyncValue落后了一步。
当从LocationChanged内部调用时,如何防止异步方法滞后?
发布于 2020-05-26 05:15:18
经过多次尝试和错误之后,我发现如下:
await Task.Delay(1)填充路由参数为止。StateHasChanged()。base.InvokeAsync(() => ...)包装调用经过这些修改后,OnLocationChanged变成:
private void OnLocationChanged(object sender, LocationChangedEventArgs args)
{
// ...
base.InvokeAsync(async () =>
{
await Task.Delay(1); // wait for blazor to populate route parameters
await DoSomeAsync();
StateHasChanged();
});
}发布于 2020-05-25 16:40:47
用异步标记方法不会更改该方法的签名,因此您应该可以这样做:
private async void OnLocationChanged(object sender, LocationChangedEventArgs args)
{
// sync action:
SyncValue = (Counter * 1000).ToString();
await DoSomeAsync();
StateHasChanged();
}https://stackoverflow.com/questions/62005983
复制相似问题