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

标签 c# asp.net webforms async-await

当我遇到这个时,我正在用 ASP.NET 编写一些代码:

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

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

最佳答案

是的,它是安全的,但并不真正推荐。 recommended way to do this is via RegisterAsyncTask .但是,ASP.NET(Web 窗体)将正确处理 async void 事件处理程序。

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

我有一个 MSDN article on async ASP.NET你可能会觉得有帮助。如果您对 ASP.NET 运行时如何意识到 async 处理程序尚未完成感到好奇,我将在 an earlier MSDN article 中介绍它。 .

关于c# - 在 ASP.NET 事件处理程序中使用 async/await 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27282617/

相关文章:

asp.net - 在 Asp.net 中 POST 后清除表单

c# - 如何处理大对象?

c# - 加载动态创建的 ASCX 控件(通过代码)

javascript - 使用 javascript 将面板设置为可见

某些用户的 ASP.NET IIS 身份验证问题

asp.net - Views 文件夹外的 CSHTML 文件

c# - 带有 EF6 和 dotConnect for oracle 的 aspnetcore 2.0

c# - 如何防止 WPF TreeView 在多个项目上引发 MouseEnter?

c# - ASP.NET Core 中的 ValidateInput(bool)

ajax - 用于 ajax 表单的 ASP.NET MVC 2 服务器端验证