Правильно распоряжаться ресурсами, используемыми SmtpClient - PullRequest
6 голосов
/ 15 июля 2009

У меня есть C # служба , которая работает непрерывно с учетными данными пользователя (т.е. не как локальная система - я не могу изменить это, хотя хочу). По большей части служба работает нормально, но очень часто она взрывается и перезапускается без видимой причины (диспетчер сервера обслуживания настроен на перезапуск службы при сбое).

Я веду существенную регистрацию событий , и у меня есть многоуровневый подход к Обработка исключений , которая, по моему мнению, имеет по крайней мере некоторый смысл:

  • По сути, я получил общий уровень универсальное исключение, нулевое исключение и обработчики исключений при запуске.
  • Затем я получил различные обработчики на « уровне команды » (т.е. конкретные действия, которые выполняет служба)
  • Наконец, я обработал несколько исключений, обработанных на уровне класса

Я проверял, не высвобождены ли какие-либо ресурсы должным образом, и я начинаю подозревать мой почтовый код (отправить письмо). Я заметил, что не вызывал 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);
        }
    }

Ответы [ 2 ]

5 голосов
/ 15 октября 2010

Я знаю, что этот вопрос является предварительным .Net 4, но версия 4 теперь поддерживает метод Dispose, который правильно отправляет команду quit на сервер smpt. См. msdn ссылка и более новый вопрос о переполнении стека .

1 голос
/ 15 июля 2009

Есть задокументированные проблемы с классом SmtpClient. Я рекомендую покупать сторонний контроль, так как они не слишком дороги. Чилкат делает приличный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...