2009-07-14 2 views
6

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

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

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

Я был глядя на то, что какие-либо ресурсы не выпущены должным образом, и я начинаю подозревать свой почтовый код (отправлять электронную почту). Я заметил, что я не звонил в Dispose для MailMessage объекта, и теперь я переписал код SendMail, как показано ниже.

Основной вопрос является:

  • будет этот код правильно освободить все ресурсы, используемые для отправки почты?
  • Объект SmtpClient?
  • (для записи: Я не использую инициализатор объекта, чтобы сделать образец легче читать)
private static void SendMail(string subject, string html) 
    { 
     try 
     { 
      using (var m = new MailMessage()) 
      { 
       m.From = new MailAddress("[email protected]"); 
       m.To.Add("[email protected]"); 
       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); 
     } 
    } 

ответ

5

Я знаю, что этот вопрос является pre .Net 4, но версия 4 теперь поддерживает метод Dispose, который правильно отправляет выход на сервер smpt. См. msdn reference и a newer stackoverflow question.

1

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

+0

Спасибо за информацию - мне, возможно, придется посмотреть на это. Странно, что объект MailMessage реализует IDisposable, но SmtpClient этого не делает. –

+0

Да. Кажется, есть работа, размещенная по этой ссылке. Может захотеть проверить это. –

Смежные вопросы