【问题标题】:Optimization - Emails in a ASP.NET app优化 - ASP.NET 应用程序中的电子邮件
【发布时间】:2009-04-02 06:35:21
【问题描述】:
快速提问。只是想确认诸如 SMTP 服务器之类的网络调用不会占用任何 CPU 使用率。它只会阻止我的一个请求处理线程,并且触发电子邮件的用户必须等待我的网络服务器完成 SMTP 调用。如果我在另一个线程中发送电子邮件并让用户线程继续,那么我就摆脱了这个问题。对吗???
我的一位同事建议使用单独的自定义 Web 服务,该服务将使用 smtp 服务器发送电子邮件?
【问题讨论】:
标签:
asp.net
web-services
email
【解决方案1】:
我建议将电子邮件排队,然后通过单独的进程(服务或工作线程)发送。最初的实施需要付出更多的努力,但从长远来看是有回报的。
电子邮件服务器可能会脱机或运行缓慢,因此强制用户等待可能会给他们的应用程序带来不好的体验。
例如,如果您要发送注册验证电子邮件,那么如果他们在一段时间内(例如 1 天)未进行验证,您可能还需要稍后再发送电子邮件。有了支持队列设计的基础架构,这变得更容易了。
【解决方案2】:
我认为您最好的方法是简单地使用 SmtpClient 类的 SendAsync 方法来异步发送电子邮件。
例如:
SmtpClient client = new SmtpClient(mySMTPHost);
client.SendAsync(myMailMessage, null);
您甚至可以将委托作为第二个参数传递给 SendAsync 方法,该方法将充当回调,并在 SendAsync 方法完成时被调用。请参阅 MSDN 站点 here 上的示例。
这应该为您提供两全其美的优势,因为您可以异步发送电子邮件而不会占用您的主执行线程,同时还避免产生和管理您自己的线程(或编写单独的“服务”)的复杂性。
【解决方案3】:
你的理论似乎是正确的。发送电子邮件的线程应该将大部分时间花在等待响应或等待操作完成上,这不是 CPU 密集型的,也不应该占用其他线程的 CPU。
对我来说,调用单独的自定义 Web 服务听起来有点像不必要的开销。可以远程调用 SMTP 服务器本身;调用自定义 Web 服务只是添加另一层。但我可能误解了你同事的想法。