我正在构建一个MVC应用程序,在这个应用程序中,有一些行为暗示了一些事情。因此,我们希望使用邮件系统警告我们的客户/用户。我正在建立一个本地应用程序和一个网络商店,所以我有时需要发送大量邮件。
我目前正在使用MvcMailer
为什么它的工作很好,但我主要担心的是,因为它发生在正常的方法调用期间(例如:操作的结果,然后:
MvcMailMessage msg = mailer.NewOrder(emailTo);
msg.Send();
消息传来,需要一段时间。而且由于这种操作可能被调用了很多次,它将整体减慢整个过程,这是我不希望的。
所以我的问题是:我该如何处理邮件处理?是否有一种我可以使用的异步工具可以完成这项工作?我是否将它们存储在数据库表中并有时发送它们?我在Windows .Net中听说过Task
,但我从来没有使用过,这是一个选项吗?
我正在寻找建议,请随时分享您的意见!谢谢!
答案 0 :(得分:1)
您可以使用SmtpClient.SendMailAsync
关键字
async-await
public async Task SendSmtpMailAsync()
{
SmtpClient smtpClient = new SmtpClient();
MailMessage mailMessage = new MailMessage("FromAddress", "ToAddress", "Subject", "Body");
await smtpClient.SendMailAsync(mailMessage);
// Possibly do more stuff here.
}
当您在异步方法上await
时,控件会返回给调用者。这意味着ASP.NET可以使用返回到ASP的线程同时处理消息
来自同一方法的.NET ThreadPool。方法完成后,它将返回到等待的行并继续执行。
请注意,单独使用此async
不会将请求返回给调用者,它只会让您同时处理更多请求。你可以做的是使用这个方法与生产者 - 消费者风格集合相关联,比如BlockingCollection<T>
,将你的消息添加到它并将响应返回给你的调用者。在后台,使用SendMailAsync
执行这些请求。