在ASP.NET事件处理程序中使用async / await是否安全?

当我遇到这个时,我在ASP.NET中做了一些编码:

protected async void someButtonClickHandler(...) { if(await blah) doSomething(); else doSomethingElse(); } 

在提出这个问题之后,我对async / await如何工作有了更好的理解。 但后来让我感到震惊的是,以上面显示的方式使用async / await是否安全?
我的意思是在调用await blah之后调用者继续执行。 这意味着它可能会在await blah完成之前将响应呈现给客户端。 这是正确的吗? 如果是这种情况, doSomething() / doSomethingElse()会发生什么。 他们会被处决吗? 如果它们被执行了,用户是否会看到其更改的效果?
在我的情况下,这些方法会更改显示给用户的一些数据,但我也想知道在一般情况下会发生什么。

是的,这是安全的,但不是真的推荐。 建议的方法是通过RegisterAsyncTask 。 但是,ASP.NET(Web窗体)将正确处理async void事件处理程序。

当处理程序await时,响应不会呈现给客户端; await只产生ASP.NET运行时,而不是客户端。 ASP.NET运行时知道事件处理程序尚未完成,因此它知道不发送响应。 当事件处理程序完成时,ASP.NET运行时通过发送响应来响应。

我有关于异步ASP.NET的MSDN文章 ,您可能会发现它很有帮助。 如果您对ASP.NET运行时如何知道async处理程序尚未完成感到好奇,我将在之前的MSDN文章中介绍它 。