6

我有一个使用用户凭据连续运行的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);
        }
    }
4

2 回答 2

5

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

于 2010-10-15T00:36:51.350 回答
1

SmtpClient 类存在已记录的问题。我建议购买第三方控件,因为它们不太贵。奇尔卡特做得不错。

于 2009-07-14T22:29:39.607 回答