代码之家  ›  专栏  ›  技术社区  ›  Stein Åsmul

正确处理SmtpClient使用的资源

  •  6
  • Stein Åsmul  · 技术社区  · 15 年前

    我有一个 C#服务 那个 连续运行 (servicer manager设置为在崩溃时重新启动服务)。

    我正在做大量的工作 事件记录 ,我有一个 分层方法 异常处理 我认为这至少有点道理:

    • 顶级 通用异常、空异常和启动异常处理程序。
    • 指挥级 “(即服务运行的特定操作)
    • 最后,我处理了一些在

    我一直在考虑是否有任何资源没有被适当地释放,我开始怀疑我的邮件代码(发送电子邮件)。我注意到我没有打电话给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 回复  |  直到 10 年前
        1
  •  5
  •   Community Egal    7 年前

    我知道这个问题是在.NET4之前,但是版本4现在支持一个Dispose方法,可以正确地向smpt服务器发送quit。见 msdn reference a newer stackoverflow question .

        2
  •  1
  •   Spencer Ruport    15 年前

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