SmtpClient - 什么是适当的寿命?

时间:2015-06-02 08:31:17

标签: c# .net email service

我正在创建每5分钟发送一批电子邮件的Windows服务。

我想每5分钟发送一批10-100封电子邮件。这是极端的边缘情况。批次每5分钟发送一次,通常最多包含10封电子邮件。

我在System.Net.Mail命名空间中使用SmtpClient。

SmtpClient对象的适当生命周期是多少? 每次发送批次时我应该创建一个吗? 或者我应该在服务启动时创建一个并且从不处理它?<​​/ p>

3 个答案:

答案 0 :(得分:7)

您应始终使用using

using (var smtpClient = new SmtpClient())
{
    smtpClient.SendMail(message);
}

一旦完成它,你应该总是处理任何实现IDisposable的东西..NET 4.0中的SmtpClient类实现了IDisposable,所以一定要使用它!

引用MSDN:

  

SmtpClient类没有Finalize方法,因此应用程序必须   调用Dispose以显式释放资源。

如果您发现自己正在执行与异步相关的任务,那么您可以为每封电子邮件创建一个新实例,以防止阻止自己。您可以使用以下内容。

var smtpClient = new SmtpClient();
smtpClient.SendCompleted += (s, e) => {
                           client.Dispose();
                           message.Dispose();
                        };
client.SendAsync(message, null);

请求 - 批量发送电子邮件的最佳选择

如上所述,您可以重复使用同一个客户端。如果你把它全部放在同一个线程上,我建议你只使用一个客户端

MSDN状态:

  

SmtpClient类实现将SMTP连接汇集到一起   可以避免为每个人重新建立连接的开销   消息到同一台服务器。 应用程序可能会重复使用相同的内容   SmtpClient对象向同一个SMTP发送许多不同的电子邮件   服务器和许多不同的SMTP服务器。

然而它继续说:

  

...因此,无法确定应用程序的时间   使用SmtpClient对象完成后应该清理它。

因此,假设您在完成后处置了您的客户端,那就没问题了。

我最近发现自己在问同样的问题时讨论了下面链接的一些与SMTP相关的主题

来自Stackoverflow的

更多内容:

What are best practices for using SmtpClient, SendAsync and Dispose under .NET 4.0

How to dispose objects having asynchronous methods called?

相关阅读:

MSDN SmtpClient

Implementing Finalize and Dispose to clean up managed resources

答案 1 :(得分:3)

从.NET 4.0开始,SmtpClient将连接池连接起来,因此您可能会保留一段时间。完成批量发送后,最好将其处理掉。

来自MSDN:https://msdn.microsoft.com/en/us/library/system.net.mail.smtpclient(v=VS.100).aspx

  

SmtpClient类实现汇集了SMTP连接,因此可以避免为同一服务器的每条消息重新建立连接的开销。应用程序可能会重复使用相同的SmtpClient对象将许多不同的电子邮件发送到同一SMTP服务器和许多不同的SMTP服务器。因此,无法确定何时使用SmtpClient对象完成应用程序,并且应该清除它。

答案 2 :(得分:0)

首先,除非您需要在整个应用程序中使用其实用程序,否则在任何需要时使用任何对象是一种非常好的做法。

其次,你应该在每次需要时创建SmtpClient的对象并妥善处理它,为此使用Glitch100上面描述的using标签。

 using (var smtpClient = new SmtpClient())
 {
     smtpClient.SendMail(message);
 }