【问题标题】:Blazor Web code after await doesn't execute until the second time等待后的 Blazor Web 代码直到第二次才执行
【发布时间】:2020-10-30 02:33:43
【问题描述】:

在 Blazor Web 中,我有一个从按钮调用的方法,该方法对 API 进行 HttpClient 调用,然后在表单上填充字段(结果)。当我第一次调用它时,什么也没有发生。当我第二次调用它时,该字段被填充。 Chrome 确认 API 调用两次都成功。看起来等待之后的代码直到第二次调用才执行。我做错了什么?

private async void DoAPICall()
{
    VerificationReturnType ReturnData = await Http.GetFromJsonAsync<VerificationReturnType>(APIMethod);
    Result = String.Format("TrustedCookie: {0}\r\nVerificationCookie: {1}\r\nError: {2}\r\n", ReturnData.TrustedCookie, ReturnData.VerificatonCookie, ReturnData.Error);
}

【问题讨论】:

  • 永远不要使用async void,除了实际的事件处理程序——用event定义的事物的处理程序或不接受Task返回值的委托

标签: blazor-webassembly


【解决方案1】:

通过将 DoAPICall 的返回类型从 void 更改为 Task 来修复。尽管 DoAPICall 在功能上是 Web 表单按钮 onclick 事件的事件处理程序,并且异步事件处理程序通常必须具有 void 返回类型,但在此(Blazor Web)上下文中,该方法必须具有 Task 返回类型。

另外,(这是我的第一个解决方案),不要尝试通过附加 .Result 来同步调用 GetFromJsonAsync 方法,就像在编写后端 C# 应用程序时那样。它会编译正常,但在浏览器中运行时会崩溃。

真的希望这可以帮助其他有初学者错误的人 - Blazor Web 有这样的潜力!

【讨论】:

  • 不是事件处理程序,即使名称如此说明。这是一个具有特殊状态更新魔法的回调。 async void 专门用于无法由返回 Task 的委托处理的旧式 .NET 事件。
猜你喜欢
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多