正确处理SmtpClient使用的资源

Ste*_*mul 6 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jef*_*eff 5

我知道这个问题是pre .Net 4,但是版本4现在支持Dispose方法,该方法正确地向qumpt服务器发送退出.请参阅msdn参考更新的stackoverflow问题.