【问题标题】:How to return view while waiting for await function in MVC如何在 MVC 中等待等待函数时返回视图
【发布时间】:2019-01-22 16:29:26
【问题描述】:

我使用 await 功能来发送电子邮件。在等待等待功能完成时,是否有任何解决方案如何显示页面或返回视图()。

这是我的代码:

 using (var smtp = new SmtpClient())
                {
                    var credential = new NetworkCredential
                    {
                        UserName = "email@gmail.com",
                        Password = "paswordEmail"
                    };
                    smtp.Credentials = credential;
                    smtp.Host = "smtp-mail.outlook.com";
                    smtp.Port = 587;
                    smtp.EnableSsl = true;
                    await smtp.SendMailAsync(message); //Here is my await function for sending an email
                    return RedirectToAction("ThankYou"); //This thank you page. I want to display this html page without waiting for await complete
                }

【问题讨论】:

  • 只是不要等待发送。
  • 如果不等待发送,则将其从 using 块中删除,否则它可能会在有时间完成之前超出范围。
  • @AlexanderHiggins 如果删除等待则出错 - [InvalidOperationException:异步模块或处理程序已完成,而异步操作仍处于挂起状态。]
  • 如果您需要等待,请将其包装在 Task.Run(()=> {});
  • 您也可以在 Task.Run(()=> {}) 中调用 send 或使用发布的 Async Nkosi

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


【解决方案1】:

您可以将邮件代码包装在 Task.Run 中而不是等待它。

Task.Run(async () => {
    using (var smtp = new SmtpClient()) {
        var credential = new NetworkCredential {
            UserName = "email@gmail.com",
            Password = "paswordEmail"
        };
        smtp.Credentials = credential;
        smtp.Host = "smtp-mail.outlook.com";
        smtp.Port = 587;
        smtp.EnableSsl = true;
        await smtp.SendMailAsync(message); //Here is my await function for sending an email
    }
});
return RedirectToAction("ThankYou"); 

【讨论】:

  • 但你不应该这样做。您可以关闭整个应用程序。
【解决方案2】:

ASP.NET 有自己的工具来执行后台工作:HostingEnvironment.QueueBackgroundWorkItem Method

把你的作品发到那里:

HostingEnvironment.QueueBackgroundWorkItem(
    async () =>
    {
        using (var smtp = new SmtpClient
            {
                Host = "smtp-mail.outlook.com",
                Port = 587,
                EnableSsl = true,
                Credentials = new NetworkCredential
                {
                    UserName = "email@gmail.com",
                    Password = "paswordEmail",
                },
            })
        {
            await smtp.SendMailAsync(message); //Here is my await function for sending an email
        }
    });
return RedirectToAction("ThankYou"); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2020-08-19
    • 2013-07-22
    • 1970-01-01
    相关资源
    最近更新 更多