首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从NavigationManager.LocationChanged内部调用异步方法

从NavigationManager.LocationChanged内部调用异步方法
EN

Stack Overflow用户
提问于 2020-05-25 15:44:39
回答 2查看 3.1K关注 0票数 6

我使用NavigationManager.LocationChanged捕获查询字符串。在获得查询字符串值之后,我将进行ajax调用,即异步调用。LocationChanged本身是同步方法,看起来没有异步版本的LocationChanged。当从LocationChanged内部调用异步方法时,异步方法设置的值落后了一步。

这是复制品:

代码语言:javascript
运行
复制
@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内部调用时,如何防止异步方法滞后?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-26 05:15:18

经过多次尝试和错误之后,我发现如下:

  1. 在运行LocationChanged时尚未设置路由参数值。这一点在我上面的例子中没有显示出来,但在我的例子中很重要。路由参数可以从URL中手动提取,也可以等到blazor使用await Task.Delay(1)填充路由参数为止。
  2. 在异步方法的末尾调用StateHasChanged()
  3. 根据文件我们应该用base.InvokeAsync(() => ...)包装调用

经过这些修改后,OnLocationChanged变成:

代码语言:javascript
运行
复制
private void OnLocationChanged(object sender, LocationChangedEventArgs args)
{
    // ...

    base.InvokeAsync(async () =>
    {
        await Task.Delay(1);  // wait for blazor to populate route parameters
        await DoSomeAsync();
        StateHasChanged();
    });
}
票数 9
EN

Stack Overflow用户

发布于 2020-05-25 16:40:47

用异步标记方法不会更改该方法的签名,因此您应该可以这样做:

代码语言:javascript
运行
复制
private async void OnLocationChanged(object sender, LocationChangedEventArgs args)
{
   // sync action:
   SyncValue = (Counter * 1000).ToString();

   await DoSomeAsync();
   StateHasChanged();
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62005983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档