SmtpClient - 什么是适当的寿命?

Hoo*_*och 7 .net c# email service

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

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

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

什么是SmtpClient对象的适当生命周期?每次发送批次时我应该创建一个吗?或者我应该在服务启动时创建一个并且永远不会丢弃它?

Jon*_*onE 7

你应该总是利用 using

using (var smtpClient = new SmtpClient())
{
    smtpClient.SendMail(message);
}
Run Code Online (Sandbox Code Playgroud)

一旦完成它,你应该总是处理任何实现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);
Run Code Online (Sandbox Code Playgroud)

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

如上所述,您可以重用相同的客户端.如果你把它全部保存在同一个线程上,我建议你只使用一个客户端

MSDN国家:

SmtpClient类实现汇集了SMTP连接,因此可以避免为同一服务器的每条消息重新建立连接的开销.应用程序可能会重复使用相同的SmtpClient对象将许多不同的电子邮件发送到同一SMTP服务器和许多不同的SMTP服务器.

然而它继续说:

...因此,无法确定何时使用SmtpClient对象完成应用程序,并且应该清除它.

因此,假设您在完成后丢弃了客户端,那就没问题了.


下面链接了许多与SMTP相关的主题的讨论,因为我最近发现自己也在问同一个问题

来自Stackoverflow的更多信息:

在.NET 4.0下使用SmtpClient,SendAsync和Dispose的最佳实践是什么

如何处理具有异步方法的对象?

相关阅读:

MSDN SmtpClient

实现Finalize和Dispose以清理托管资源


rle*_*lee 5

从 .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 对象并应将其清理。