c# blazor 在委托类型 returns 'void' 时避免使用 'async' lambda

c# blazor avoid using 'async' lambda when delegate type returns 'void'

我在 JetBrains Rider 中收到以下警告,但我找不到解决方法。 这是一个 .net 6 的 blazor WASM 项目。

Avoid using 'async' lambda when delegate type returns 'void'

Razor 示例代码:

<Validation Validator="async e => await ValidateFieldAsync(e)">

示例代码 c#:

protected async Task ValidateFieldAsync(ValidatorEventArgs args)
{
    // Some code with awaits etc.
}

Jetbrains 在此处描述此警告:

https://www.jetbrains.com/help/resharper/AsyncVoidLambda.html

但是解决此问题的最佳做法是什么?

感谢任何提示!

从 razor 调用函数时不要调用 Task 函数。调用 void 函数,因为这是预期的。

<Validation Validator="e => ValidateFieldAsync(e)">

那么实际代码:

protected async void ValidateFieldAsync(ValidatorEventArgs args)
{
    // Some code with awaits etc.
}

它仍然会 运行 异步所以不用担心在剃须刀调用代码中有 async

这里根本不需要 lambda。

<Validation Validator="ValidateFieldAsync" >

<Validation Validator=@ValidateFieldAsync >

<Validation Validator=ValidateFieldAsync >

应该都可以 - 这只是您对风格的偏好。

您通过此方法 return 任务是正确的。

Resharper 似乎在这里迷路了。警告不正确。

但无论如何你都可以改进它,

<Validation Validator="e => ValidateFieldAsync(e)">

只要 ValidateFieldAsync() 仍然 returns async Task 这仍然是异步和可等待的,只是开销少了一点。 lambda 中的 ayncawait 添加了一个不需要的额外层。 它可能会阻止错误警告,我现在无法检查。

当你不需要任何参数或者当 Blazor 可以自动添加它时,你可以按照@MisterMagoo 的回答。