我有一个void
事件处理程序,该事件处理程序仅包含一行,它是对await
able方法的调用。
void Handler( object sender, EventArgs args ) => AwaitableMethod();
无法将返回类型更改为Task
,因此无论语法如何,它都是一劳永逸的。即便如此,Visual Studio还是在未调用await
的情况下将绿色弯曲显示,建议我将处理程序async void
和await
称为该调用。
async void Handler( object sender, EventArgs args ) => await AwaitableMethod();
我的理解是,在这种情况下,添加async void
和await
只会产生无用的开销。 Visual Studio知道我不知道的东西,还是只是不必要地令人讨厌?
在这种情况下,主要取决于您的错误处理。
如果AwaitableMethod
异步抛出,它将在第二个版本的UI线程上抛出。
我的理解是,在这种情况下,添加异步void和await只是无用的开销。
编号
如果Handler
返回了Task
,则为true,eliding async
/await
可以;没有async
/ await
的代码只会直接返回async
,而不是用await
“解包”然后用Task
“解包”成await
。
但是,事实并非如此; Task
返回async
,因此没有Handler
/ void
的代码将只忽略返回的async
,这在大多数情况下是错误的(因此出现编译器警告)。具体来说,忽略await
将忽略该Task
中的任何异常。您的代码也不太可能知道被忽略的Task
何时完成,但是由于您的处理程序返回了Task
,因此大概可以接受。
Task
方法进行了“注册”,以便框架知道仍有任务在进行中,因此框架知道何时可以安全关闭。 .NET提供的唯一真正关心的框架是ASP.NET pre-Core。 .NET提供的所有其他框架(包括所有UI框架)都忽略了该“注册”。