CA2012 关于在 Blazor 中使用 ValueTask 的警告。如何在 Blazor 中正确实现"fire and forget"?



IJSRuntime.InvokeVoidAsync()作为代码路径中的最后一件事调用会导致CA2012(正确使用ValueTasks(警告。它可以被安全地忽略吗?还是我应该等待它来解决这个问题?

当我在同步调用结束时添加.Preserve()时,警告就会消失,代码也会正常工作。为什么?会发生什么?这种方法有什么作用?(Preserve()方法的(文件不清楚。

我想要";火与遗忘;使用返回CCD_ 4。实现这一点的最正确方法是什么,从同步方法调用它?

为了添加一些上下文,我从Blazor代码中执行JS。我不依赖JS代码调用后产生的效果。这就是为什么我不等待它。我可以重构我的代码以等待ValueTask,但它除了让代码分析器满意之外还有其他用途吗?

但是从老式事件处理程序调用呢?它们最多可以是async void

Blazor事件处理程序回到学校,都可以是async Task。Razor引擎知道如何处理这个问题。

唯一的问题是非Blazor事件,比如Timer中的Elapsed事件。你可能需要async void

现在我的想法是尝试去"一直异步";

是的,这就是我们要走的路。

进行同步(非异步(是对不需要任何异步的代码路径的小型优化。例如Counter示例中的IncrementCount((方法(事件处理程序(。

但除了让代码分析器高兴之外,它还有其他用途吗?

这将有助于Blazor在更新完成后刷新UI。即发即弃必须为一个执行它自己的StateHasChanged((逻辑。

如果你真的想;f、_ = DoSomethingAsyncWithoutAwait();

InvokeAsync()将您的Task发送到主UI线程。目前,这只适用于Blazor服务器。只有当Task需要更新UI时才需要它,而从正常的Blazor代码来看,最好只是等待。Blazor的正常生命周期不会被阻止。使用它来避免警告是次优的。

最新更新