Blazor UI 更新异步 void 与异步任务

Cri*_*s M 4 blazor blazor-client-side blazor-webassembly

Blazor 新手,

我正在通过 API 登录,但我注意到 UI 不会自动更新。

例如:当我第一次登录无效用户时,不会显示错误消息,但第二次尝试时会正确显示。不知怎的,有1次点击延迟。

  private async void DoLogin()
  {
        var result = await API.LoginAsync(username, password);

        if (result.ResultID == 0)
        {

        }
        else
            ErrorMessage = result.ErrorMessage;
  }
Run Code Online (Sandbox Code Playgroud)

剃须刀组件: 在此输入图像描述

当我把它改成

  private async Task DoLogin()
  {
        var result = await API.LoginAsync(username, password);

        if (result.ResultID == 0)
        {

        }
        else
            ErrorMessage = result.ErrorMessage;
  }
Run Code Online (Sandbox Code Playgroud)

它正在按预期工作。

有人可以照亮吗

  • 在方法签名中使用 async void 和 async Task 有什么区别?
  • 为什么 async void 不会立即更新 UI?

Hen*_*man 5

在方法签名中使用 async void 和 async Task 有什么区别?

  • 可以等待async Task(也只是Task)返回,Blazor 将使用它。
  • 一种async void方法是“即发即忘”。应尽可能避免。

为什么 async void 不会立即更新 UI?

因为它是在不被观察到的情况下执行的。在这种情况下,它与按钮之后完成的代码并行运行(但慢于)。因此 UI在 LoginAsync() 返回之前更新。