正确处理 SmtpClient 使用的资源
Posted
技术标签:
【中文标题】正确处理 SmtpClient 使用的资源【英文标题】:Properly disposing resources used by SmtpClient 【发布时间】:2010-11-10 19:59:57 【问题描述】:我有一个 C# 服务,它使用用户凭据连续运行(即不是本地系统 - 虽然我想更改但无法更改)。在大多数情况下,该服务似乎运行良好,但它经常出现故障并无缘无故地重新启动(服务管理器设置为在崩溃时重新启动服务)。
我正在做大量的事件记录,并且我有一个分层方法来异常处理,我认为这至少在某种意义上是有意义的:
基本上我得到了***通用异常、空异常和启动异常处理程序。 然后我在“命令级别”(即服务运行的特定操作)获得了各种处理程序 最后我处理了一些在类级别处理的异常我一直在查看是否有任何资源没有正确释放,并且我开始怀疑我的邮件代码(发送电子邮件)。我注意到我没有为 MailMessage 对象 调用 Dispose,我现在重写了 SendMail 代码,如下所示。
基本问题是:
此代码是否会正确释放用于发送邮件的所有资源? 我没有看到处置 SmtpClient 对象的方法? (记录:我没有使用对象初始化器来使示例更易于阅读) private static void SendMail(string subject, string html)
try
using ( var m = new MailMessage() )
m.From = new MailAddress("service@company.com");
m.To.Add("user@company.com");
m.Priority = MailPriority.Normal;
m.IsBodyHtml = true;
m.Subject = subject;
m.Body = html;
var smtp = new SmtpClient("mailhost");
smtp.Send(m);
catch (Exception ex)
throw new MyMailException("Mail error.", ex);
【问题讨论】:
【参考方案1】:我知道这个问题是 .Net 4 之前的问题,但版本 4 现在支持 Dispose 方法,该方法可以正确地将退出发送到 smpt 服务器。请参阅msdn reference 和a newer *** question。
【讨论】:
【参考方案2】:SmtpClient 类有documented issues。我建议购买第三方控件,因为它们不太贵。 Chilkat 做得不错。
【讨论】:
感谢您的信息 - 我可能需要看看。奇怪的是MailMessage对象实现了IDisposable,而SmtpClient却没有。 是的。该链接上似乎有一个解决方法。可能想检查一下。以上是关于正确处理 SmtpClient 使用的资源的主要内容,如果未能解决你的问题,请参考以下文章