Blazor InvokeAsync 与等待 InvokeAsync
Blazor InvokeAsync vs await InvokeAsync
编辑:澄清一下,这是在 Blazor 服务器应用程序中
我对 InvokeAsync 的正确用法和更新 UI 感到困惑。该文档有多种用法,但没有真正解释等待或不等待的原因。我也看到了一些相互矛盾的线索,没有太多证据支持他们的推理。
让所有方法异步等待 InvokeAsync(StateHasChanged) 似乎是错误的,我在某处读到引入 InvokeAsync 的原因是为了防止到处都需要异步代码。但是什么情况下我可能想要等待呢?
等待中:
非等待丢弃:
https://docs.microsoft.com/en-us/aspnet/core/blazor/components/rendering?view=aspnetcore-5.0
以下是我看到的一些不同用法的示例,如果有人可以解释或分享任何链接,其中包含有关它们之间某些差异的信息,那就太好了(谢谢!)
public void IncrementCounter()
{
_counter++;
InvokeAsync(StateHasChanged);
}
public void IncrementCounter()
{
InvokeAsync(() =>
{
_counter++;
StateHasChanged);
}
}
public async Task IncrementCounter()
{
_counter++;
await InvokeAsync(StateHasChanged);
}
public async Task IncrementCounter()
{
await InvokeAsync(() =>
{
_counter++;
StateHasChanged();
});
}
IncrementCounter(一个 ButtonClick 处理程序)看起来是错误的 - 它总是 运行 在 SyncContext 线程上,并且总是可以使用没有调用的普通 StateHasChanged()。
所以让我们看看计时器事件。 Threading.Timer class 不支持异步处理程序,因此您 运行 在未指定线程上的 void Tick() { ... }
中。
这里确实需要InvokeAsync(StateHasChanged)
。您可以将 Tick 方法设置为 async void
只是为了等待 InvokeAsync,但这会给出错误的信号。在没有 await
的情况下使用 InvokeAsync 是较小的邪恶。
void Tick() // possibly threaded event handler
{
_counter++;
InvokeAsync(StateHasChanged); // fire-and-forget mode
}
但是当你在一个异步方法中并且仍然需要 InvokeAsync 时,等待它会更整洁,因为你可以。
async Task SomeService()
{
_counter++;
await InvokeAsync(StateHasChanged);
}
编辑:澄清一下,这是在 Blazor 服务器应用程序中
我对 InvokeAsync 的正确用法和更新 UI 感到困惑。该文档有多种用法,但没有真正解释等待或不等待的原因。我也看到了一些相互矛盾的线索,没有太多证据支持他们的推理。
让所有方法异步等待 InvokeAsync(StateHasChanged) 似乎是错误的,我在某处读到引入 InvokeAsync 的原因是为了防止到处都需要异步代码。但是什么情况下我可能想要等待呢?
等待中:
非等待丢弃:
https://docs.microsoft.com/en-us/aspnet/core/blazor/components/rendering?view=aspnetcore-5.0
以下是我看到的一些不同用法的示例,如果有人可以解释或分享任何链接,其中包含有关它们之间某些差异的信息,那就太好了(谢谢!)
public void IncrementCounter()
{
_counter++;
InvokeAsync(StateHasChanged);
}
public void IncrementCounter()
{
InvokeAsync(() =>
{
_counter++;
StateHasChanged);
}
}
public async Task IncrementCounter()
{
_counter++;
await InvokeAsync(StateHasChanged);
}
public async Task IncrementCounter()
{
await InvokeAsync(() =>
{
_counter++;
StateHasChanged();
});
}
IncrementCounter(一个 ButtonClick 处理程序)看起来是错误的 - 它总是 运行 在 SyncContext 线程上,并且总是可以使用没有调用的普通 StateHasChanged()。
所以让我们看看计时器事件。 Threading.Timer class 不支持异步处理程序,因此您 运行 在未指定线程上的 void Tick() { ... }
中。
这里确实需要InvokeAsync(StateHasChanged)
。您可以将 Tick 方法设置为 async void
只是为了等待 InvokeAsync,但这会给出错误的信号。在没有 await
的情况下使用 InvokeAsync 是较小的邪恶。
void Tick() // possibly threaded event handler
{
_counter++;
InvokeAsync(StateHasChanged); // fire-and-forget mode
}
但是当你在一个异步方法中并且仍然需要 InvokeAsync 时,等待它会更整洁,因为你可以。
async Task SomeService()
{
_counter++;
await InvokeAsync(StateHasChanged);
}