正确处置 SmtpClient 使用的资源
-
13-09-2019 - |
题
我有一个 C# 服务 那 连续运行 使用用户凭据(即不是本地系统 - 尽管我想更改,但我无法更改)。在大多数情况下,该服务似乎运行良好,但经常会出现故障, 无明显原因重新启动 (服务管理器设置为在崩溃时重新启动服务)。
我正在做实质性的事情 事件记录, ,我有一个 分层方法 到 异常处理 我认为至少有某种意义:
- 本质上我得到了 顶层 通用异常、空异常和启动异常处理程序。
- 然后我在“”处找到了各种处理程序命令级“(即服务运行的特定操作)
- 最后我处理了一些在 班级水平
我一直在查看是否有任何资源没有正确释放,并且我开始怀疑我的邮件代码(发送电子邮件)。我注意到我没有调用 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);
}
}
解决方案
我知道这个问题是 .Net 4 之前的问题,但版本 4 现在支持 Dispose 方法,该方法可以正确地将退出发送到 smpt 服务器。请参阅 msdn 参考 和 一个较新的 stackoverflow 问题.
其他提示
有 记录的问题 与 SmtpClient 类。我建议购买第三方控件,因为它们不太贵。Chilkat 做得不错。
不隶属于 StackOverflow