【问题标题】:Why does the spinner not stop straight away and show the message pop up?为什么微调器没有立即停止并显示消息弹出?
【发布时间】:2021-08-08 23:01:54
【问题描述】:

我有一个 Blazor 服务器站点,其中包含一个应该执行以下操作的简单方法:

  • 在按钮上启动微调器
  • 执行SaveChanges
  • 停止微调器并显示一条消息,提醒用户注意结果,
  • 5 秒后清除消息。

代码如下:

private async Task HandleValidSubmit() {
  // Start spinner
  Icon = "spinner-border spinner-border-sm";
  try {
    Context.Update(Case);
    await Context.SaveChangesAsync();
    message = "Key info successfully updated";
    messageStatus = "success";
  } catch (Exception ex) {
    message = ex.Message;
    messageStatus = "danger";
  }

  // Stop spinner
  Icon = "k-icon k-i-save";
  await Task.Delay(5000);
  messageStatus = " d-none";
}

但是,当运行该方法时,微调器会显示五秒钟,并且不会出现任何消​​息。如果我注释掉 await Context.SaveChangesAsync(); 它会按预期运行。

为什么当第一个 await 完成时微调器没有停止,为什么消息没有显示 5 秒?是否与两次await 通话有关?

我做错了什么?任何帮助表示赞赏。

【问题讨论】:

    标签: c# async-await blazor-server-side


    【解决方案1】:

    因为您正在以异步方法对字段进行更新,所以当您更改这些值(例如消息文本)时,可能会导致页面和文本上的状态未更新且未显示。

    尝试使用 await InvokeAsync(()=>StateHasChanged()); 告诉 UI 它应该使用新值进行更新。

    【讨论】:

    • 你的权利,因为消息是一个字段,它不会自动更新。我是否需要使用 await InvokeAsync 或者我可以只使用 StateHasChanged 它似乎可以正常工作而无需等待。等待它有什么好处?
    • 据我所知StateHasChanged 可能在使用错误的上下文(不在 UI 线程上运行)时执行问题,所以InvokeAsync 确保它在正确的线程上运行,我相信.
    • 谢谢,我找到了这个答案很好地解释了它stackoverflow.com/a/65231017/8337631
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多