繁体   English   中英

Async和Await - 将立即从MVC操作方法控制返回吗?

[英]Async and Await - Will control return immediately from an MVC action method?

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

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应用程序中。 用户将在浏览器中启动一些操作,并且将调用控制器操作方法,并且最终将在操作方法中调用此电子邮件方法。

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

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

即使DeliverAsync方法仍在尝试执行发送,控制器操作方法是否会将控制权返回给浏览器?

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

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

即使DeliverAsync方法仍在尝试执行发送,控制器操作方法是否会将控制权返回给浏览器?

从你的方法async void的事实来看,我假设控制器只是调用方法调用并返回,所以是的,它将最终返回,即使消息实际上还没有发送。

我不建议你使用这样的方法,因为任何异常将在任意线程池线程上重新抛出,并且不能保证实际正确完成。 我假设传递信息对你重要。

相反,我建议创建一个在调用控制器时提供请求的队列,以及使队列出列的另一个线程,在异步等待其完成时正确发送消息,并记录可能发生的任何错误。 以生产者 - 消费者的执行方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM