单行触发并忘记:void vs.异步void + await

问题描述 投票:2回答:2

我有一个void事件处理程序,该事件处理程序仅包含一行,它是对await able方法的调用。

void Handler( object sender, EventArgs args ) => AwaitableMethod();

无法将返回类型更改为Task,因此无论语法如何,它都是一劳永逸的。即便如此,Visual Studio还是在未调用await的情况下将绿色弯曲显示,建议我将处理程序async voidawait称为该调用。

async void Handler( object sender, EventArgs args ) => await AwaitableMethod();

我的理解是,在这种情况下,添加async voidawait只会产生无用的开销。 Visual Studio知道我不知道的东西,还是只是不必要地令人讨厌?

c# asynchronous async-await task task-parallel-library
2个回答
0
投票

在这种情况下,主要取决于您的错误处理。

如果AwaitableMethod异步抛出,它将在第二个版本的UI线程上抛出。


0
投票

我的理解是,在这种情况下,添加异步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框架)都忽略了该“注册”。

© www.soinside.com 2019 - 2024. All rights reserved.