Правильное использование ресурсов, используемых SmtpClient
-
13-09-2019 - |
Вопрос
У меня есть Служба C # это работает непрерывно с учетными данными пользователя (т.е. не как localsystem - я не могу это изменить, хотя и хочу).По большей части сервис, кажется, работает нормально, но очень часто он выходит из строя и перезапускается без видимой причины (диспетчер служб настроен на перезапуск службы при сбое).
Я делаю существенные ведение журнала событий, и у меня есть многоуровневый подход Для Обработка исключений я верю, что в этом есть хоть какой-то смысл:
- По сути, я получил высший уровень общее исключение, нулевое исключение и обработчики исключений запуска.
- Затем я нанял разных обработчиков в "командный уровень" (то есть конкретные действия, которые выполняет служба)
- Наконец, я обрабатываю несколько исключений, обработанных в уровень класса
Я проверял, не освобождены ли какие-либо ресурсы должным образом, и я начинаю подозревать свой почтовый код (отправить электронное письмо).Я заметил, что вызывал Dispose не для того, чтобы Объект MailMessage, и теперь я переписал код 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, который корректно отправляет quit на smpt-сервер.Смотрите на ссылка на msdn и новый вопрос stackoverflow.
Другие советы
Есть такие документированные проблемы с классом SmtpClient.Я рекомендую приобрести сторонний элемент управления, так как они стоят не слишком дорого.Чилкат получается неплохим.