gpt4 book ai didi

asynchronous - Blazor InvokeAsync 与 await InvokeAsync

转载 作者:行者123 更新时间:2023-12-04 01:07:42 29 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Async/await with/without awaiting (fire and forget)

(2 个回答)


9 个月前关闭。




编辑:为了澄清起见,这是在 Blazor 服务器应用程序中
我对 InvokeAsync 的正确用法和更新 UI 感到困惑。该文档有多种用法,但没有真正解释等待或不等待的原因。我也看到了一些相互矛盾的线索,但没有多少支持他们的推理。
使所有方法异步以等待 InvokeAsync(StateHasChanged) 似乎是错误的,我在某处读到引入 InvokeAsync 的原因是为了防止在任何地方都需要异步代码。但是在什么情况下我可能想要等待它?
等待:
https://docs.microsoft.com/en-us/aspnet/core/blazor/components/?view=aspnetcore-5.0&viewFallbackFrom=aspnetcore-3.0#invoke-component-methods-externally-to-update-state
非等待丢弃:
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 线程上运行,并且总是可以在没有 Invoke 的情况下使用普通的 StateHasChanged()。
因此,让我们来看看 Timer 事件。 Threading.Timer 类不支持异步处理程序,因此您在 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);
}

关于asynchronous - Blazor InvokeAsync 与 await InvokeAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65881870/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com