正确处理SmtpClient使用的资源

时间:2009-07-14 22:24:38

标签: email send smtpclient mailmessage

我有一个 C#服务 持续运行用户凭证(即不是本地系统 - 虽然我想要,但我无法改变这种情况)。在大多数情况下,该服务似乎运行正常,但它经常被炸弹并且重新启动没有明显的原因(服务器管理器设置为在崩溃时重新启动服务)。

我正在进行实质性的事件记录,我有一个分层方法异常处理,我认为至少在某种意义上:

  • 基本上我得到了顶级泛型异常,null异常和启动异常处理程序。
  • 然后我在“命令级别”(即服务运行的具体操作)中获得了各种处理程序。
  • 最后,我处理了班级
  • 处理的一些例外情况

我一直在查看是否有任何资源未正确发布,我开始怀疑我的邮件代码(发送电子邮件)。我注意到我没有为 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);
        }
    }

2 个答案:

答案 0 :(得分:5)

我知道这个问题是.Net 4之前的版本,但版本4现在支持Dispose方法,该方法可以正确地将退出发送到smpt服务器。请参阅msdn referencea newer stackoverflow question

答案 1 :(得分:1)

documented issues个SmtpClient类。我建议购买第三方控件,因为它们不太贵。奇尔卡特做得不错。