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

标签 c# .net async-await blazor

IJSRuntime.InvokeVoidAsync()被称为代码路径中的最后一件事会导致 CA2012(正确使用 ValueTasks)警告。可以安全地忽略它,还是应该通过等待来解决它?
当我添加 .Preserve()在我的同步调用结束时,警告消失,代码工作相同。这是为什么?发生什么了?这个方法有什么作用?文档(Preserve() 方法)不清楚。
我想要“即发即忘”使用返回 ValueTask 的方法.从同步方法调用它的最正确方法是什么?
添加一些上下文 - 我从 Blazor 代码执行 JS。我不依赖调用后JS代码引起的效果。这就是为什么我不等待它。我可以重构我的代码以等待 ValueTask但除了让代码分析器满意之外,它还有其他用途吗?

最佳答案

But what about calling from old school event handlers? They can be at best async void


Blazor eventhandlers 回到学校,都可以是 async Task . Razor 引擎知道如何处理这个问题。
唯一的问题是非 Blazor 事件,例如来自 Timer 的 Elapsed 事件。您可能需要 async void那里。

For now my idea is to try to go "async all the way"


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

but would it serve any other purpose than making the Code Analyzer happy?


这将有助于 Blazor 在更新完成后刷新 UI。一个即发即弃的方法必须为它自己做 StateHasChanged() 逻辑。
如果你真的想f&f,_ = DoSomethingAsyncWithoutAwait();InvokeAsync()将您的任务发送到主 UI 线程。目前仅适用于 Blazor 服务器。仅当任务需要更新 UI 时才需要它,并且从正常的 Blazor 代码开始,最好只是等待。正常的 Blazor 生命周期不会被阻止。使用它来避免警告是次优的。

关于c# - 关于在 Blazor 中使用 ValueTask 的 CA2012 警告。如何在 Blazor 中正确实现 "fire and forget"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68252275/

相关文章:

C# AnyCPU 和读/写进程内存

c# - 如何在 Wikipedia API 中使用特殊字符?

c# - Linq to Sql 强制排序依据

.net - WCF 数据服务是否返回无效的 JSON?

c# - 我应该如何对异常类的序列化进行单元测试?

asp.net - 为什么 ASP.NET 4.6 不通过 HTTP/2 为我提供页面?

c# - 异步和等待需要澄清

c# - 我能否在同步和异步 lambda 的类似方法中避免重复代码?

C# - 抛出异常但调用方方法已经完成的任务会发生什么情况?

c# - 我如何重写此代码以避免 "Linq to entities Does not recognize method"错误