【问题标题】:SendMailAsync sending very slow using async and awaitSendMailAsync 使用 async 和 await 发送速度很慢
【发布时间】:2015-06-04 20:28:07
【问题描述】:

我有一个 MVC 控制器,它通过 Ajax 帖子调用以发送电子邮件。我一直在尝试使用 async/await 模式,但发现下面的代码会导致 SendMailAsync(email) 方法出现明显延迟。谁能解释为什么会这样?

(注意,smtpClient 是在我的 UI 项目的 webconfig 中设置的)

[HttpPost]
public async Task TestMethod()
    {
        Workflow.Mailer rm = new Workflow.Mailer();
        await rm.TestEmailBasic();

    }

public async Task TestEmailBasic()
    {
        var email = new MailMessage("website@test.me", "sadsad@test.com", "Testing basic email", "Hello world");

        await SendEmailAsync(email);
    }

public async Task SendEmailAsync(MailMessage email)
    {
        using (var smtpClient = new SmtpClient())
        {
            email.Subject = "Async test";
            await smtpClient.SendMailAsync(email);
        }
    }

【问题讨论】:

  • 慢一点,我们到底在谈论多少时间?你期望什么,它的表现如何?
  • 与不使用异步相比如何?可能只是您的邮件服务器需要一段时间来处理来自您的 web 应用程序的消息,以试图减少垃圾邮件。
  • 大约需要 5 秒。没有异步也需要类似的时间,所以你可能是对的。当我使用 Ajax 调用该方法并捕获 Success 回调时,我会认为这会在任务完成之前返回吗?目前它并没有这种行为方式,因此它使 UI 感觉没有响应。有什么办法可以改善吗?

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


【解决方案1】:

正如我在博客中解释的那样,async doesn't change the HTTP protocol。 ASP.NET 请求中的await“屈服”给 ASP.NET 线程池,而不是浏览器。你可以return earlyfire-and-forget 但这些方法可能很危险,因为 ASP.NET 不是为它设计的。

【讨论】:

  • 嗯我认为某种队列是我所追求的,因为我并不是真的在等待这样的响应。火而忘记可能是我所追求的。谢谢
  • 实际上,如果我想从我的异步方法中返回一个值,比如一个字符串,我可以在 smtpClient 在线程中执行其操作的同时执行此操作吗?
  • @Raj:如果你使用即发即弃,那么你可以返回任何你想要的东西。响应被发送,HTTP 请求被认为是完整的。但是,请注意,即发即弃在 ASP.NET 上非常危险。仅当实际发送电子邮件并不重要时才应使用它。
  • 那么在您看来和经验中,在这种情况下,实现响应速度最快的 UI 的最佳(和最简单)方法是什么。消息队列听起来最好,但对于这一功能来说似乎有点过头了?
  • @Raj:取决于电子邮件的用途。如果它们很关键(即您的产品需要发送这些电子邮件才能正常工作),那么消息队列是唯一合适的选择。如果它们很好用(即它们只是通知,您的用户可以通过其他方式查看结果),那么您可以使用HostingEnvironment.QueueBackgroundWorkItem
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 2019-10-22
  • 2013-12-02
  • 2011-06-06
  • 2013-01-02
  • 1970-01-01
  • 2014-03-31
  • 2012-06-25
相关资源
最近更新 更多