我在JetBrains Rider中收到以下警告,但我找不到解决方法。这是一个带有.net6的blazor WASM项目。
当委托类型返回"void"时,避免使用"async"lambda
示例代码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
但解决此问题的最佳实践是什么?
谢谢你的提示!
这里根本不需要lambda。
<Validation Validator="ValidateFieldAsync" >
或
<Validation Validator=@ValidateFieldAsync >
或
<Validation Validator=ValidateFieldAsync >
一切都应该奏效——这只是你对风格的偏好问题。
您从该方法返回Task是正确的。
看起来Resharper在这里失去了踪迹。警告不正确。
但你无论如何都可以改进,
<Validation Validator="e => ValidateFieldAsync(e)">
只要ValidateFieldAsync((仍然返回async Task
这仍然是异步的和不可复用的,只是开销少了一点。lambda中的aync
和await
添加了一个不需要的额外层。它可能会停止这种错误的警告,我现在无法检查。
当你不需要任何争论,或者Blazor可以自动添加时,你可以按照@MisterMagoo的回答。
从剃刀调用函数时,不要调用Task
函数。调用void
函数,因为这是所期望的。
<Validation Validator="e => ValidateFieldAsync(e)">
然后实际代码:
protected async void ValidateFieldAsync(ValidatorEventArgs args)
{
// Some code with awaits etc.
}
它仍然会以异步方式运行,所以不用担心在razor调用代码中有async
。