blazor - 从 NavigationManager.LocationChanged 内部调用异步方法
问题描述
我NavigationManager.LocationChanged
用来捕获查询字符串。获取查询字符串值后,我正在进行 ajax 调用,这是异步的。LocationChanged 本身是同步方法,貌似没有异步版本的LocationChanged
. 而当从LocationChanged内部调用async方法时,async方法设置的值会滞后一步。
这是复制品:
@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 内部调用时,如何防止异步方法滞后?
解决方案
经过大量的试验和错误,这是我发现的:
LocationChanged 运行时尚未设置路由参数值。这在我上面的示例中没有显示,但对我来说很重要。路由参数可以从 URL 中手动提取,或者我们可以等到 blazor 使用
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();
});
}
推荐阅读
- android - 如何防止admob在后台工作
- python - 完成脚本中的断言?
- docker - 卷值'不匹配任何正则表达式:u'^[a-zA-Z0-9._-]+$' - elasticsearch docker-compose中的错误
- c# - 使用实体框架(C#),有没有办法加密字段,以便只有在用户登录时才能解密它们?
- linux - LVM Linux。我的任务中的 LE 是什么意思?可能是错字
- c++ - 基于 C++ QMap 在 QML 中动态创建元素的最佳方法
- excel - chrome 中的检查元素在网站上没有显示任何 id 框,我如何找到它?包含代码
- python - 如何使用 Selenium 和 Python 更改用户代理
- oauth-2.0 - 是否可以集成 2 个具有不同 OAuth2 授权类型的应用程序?
- php - 访问 WordPress index.php 响应网站目录内容文件