C# SmtpClient-什么是适当的生存期?

C# SmtpClient-什么是适当的生存期?,c#,.net,email,service,C#,.net,Email,Service,我正在创建每5分钟发送一批电子邮件的Windows服务 我想每5分钟发送10-100封电子邮件。这是极端的边缘情况。批次每5分钟发送一次,通常最多包含10封电子邮件 我正在使用System.Net.Mail命名空间中的SmtpClient SmtpClient对象的正确生存期是多少? 是否应该在每次发送批处理时创建一个? 或者我应该在服务启动时创建一个,并且永远不要处理它吗?您应该始终使用using using (var smtpClient = new SmtpClient()) {

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

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

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

SmtpClient对象的正确生存期是多少? 是否应该在每次发送批处理时创建一个?
或者我应该在服务启动时创建一个,并且永远不要处理它吗?

您应该始终使用
using

using (var smtpClient = new SmtpClient())
{
    smtpClient.SendMail(message);
}
您应该在完成IDisposable后立即处理任何实现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的更多信息:

相关阅读:


首先,在需要的时候使用任何对象都是一个非常好的做法,除非你需要在整个应用程序中使用它

其次,您应该在每次需要时创建SmtpClient的对象,并正确地处理它,为此,请使用Glitch100所述的using标记

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

从.NET 4.0开始,SmtpClient将连接池化,因此您可以在其中保留一段时间。最好在发送完一批后进行处理

从MSDN:

SmtpClient类实现将SMTP连接池化,这样就可以避免为每个邮件重新建立到同一服务器的连接的开销。应用程序可以重复使用同一SmtpClient对象向同一SMTP服务器和多个不同的SMTP服务器发送许多不同的电子邮件。因此,无法确定应用程序何时使用SmtpClient对象完成,应该清理它


我真的不同意“一旦有机会”这一部分。在我的申请表中,“一旦”是什么?另外,创建SmtpClient需要时间,因为它需要建立安全连接。这是我疯狂编辑的一部分。没有什么能阻止你使用一个客户端,特别是如果你完全控制着电子邮件的流量,但是你可能会发现你自己会遇到例外,因为它仍然在等待回复,所以无法发送电子邮件。如果你限制数量的话,它不会太贵。如果您决定使用一个客户机,也许使用BlockingCollection和信号量可以实现这一点,我想我会在每个批的客户机上创建一个。它看起来比每封邮件和每一个应用程序一次更符合逻辑。如果您在发送一批邮件时添加一个小注释,描述SmtpClient的最佳实践,我将接受您的回答。谢谢。您好@Hooch,它是在主线程中处理的,还是您正在为此创建更多?