c# - 异步和等待 - 控制会立即从 MVC 操作方法返回吗?

标签 c# asp.net-mvc async-await

我只是在学习如何使用异步和等待。假设我有以下发送电子邮件的方法:

public async void Send()
{
    // Create a network credentials object
    var credentials = new NetworkCredential(azureUserName, azurePassword);

    // Create an Web transport for sending the email
    var transportWeb = new Web(credentials);

    // Send the email
    await transportWeb.DeliverAsync(this._email);
}

此代码将存在于我正在创建的 MVC 应用程序中。用户将在浏览器中启动一些操作,然后调用 Controller 操作方法,最终将在操作方法中调用此电子邮件方法。

我的理解是,一旦执行完最后一行(带有 await 的那一行),控制权立即返回给调用者,同时 DeliverAsync 方法完成其任务。假设这是正确的,我们还假设电子邮件需要很长时间才能发送,可能需要 30 秒。即使 DeliverAsync 方法仍在尝试执行发送, Controller 操作方法是否会将控制返回给浏览器?理想情况下,这就是我希望发生的事情。

最佳答案

你的理解是正确的。但是不要使用 async void,没有必要。使用 async Task 并确保处理错误。现在,您永远不会发现导致崩溃的错误。

Will the controller action method return control back to the browser even though the DeliverAsync method is still attempting to execute the send?

这取决于该方法的作用。它的代码不在这里。现在它没有办法等待 Send 所以可能是。

同样重要的是要注意,ASP.NET 中的后台工作可能会在工作进程退出(部署、重启、崩溃等)时随时结束。

关于c# - 异步和等待 - 控制会立即从 MVC 操作方法返回吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30177087/

相关文章:

javascript - 引用 foreach 循环中的全局 jquery 函数变量

asp.net-mvc - 已经为此应用程序配置了存储机制

async-await - 异步/等待不起作用(javascript/DynamoDB)

c# - 在 MahApps.Metro 中使用数据绑定(bind) ItemsControl 时显示 WindowCommands 的分隔符

c# - 如何从两个表达式创建表达式 AND 子句

C# - 当 webRequest 发送 XML 时,将 Base64 安全为 Gif?

asp.net-mvc - RedirectToAction 根本不起作用

c# - 图像被分配给 ListView 的另一个行项目

node.js - 异步/等待超时

c# - 在 Windows 窗体中更改 ComboBox 边框颜色