Правильное использование ресурсов, используемых SmtpClient

StackOverflow https://stackoverflow.com/questions/1128390

Вопрос

У меня есть Служба 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.Я рекомендую приобрести сторонний элемент управления, так как они стоят не слишком дорого.Чилкат получается неплохим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top