Pregunta

Tengo un C # servicio que se ejecuta continuamente con credenciales de usuario (es decir, no como localsystem - No puedo cambiar esto, sin embargo quiero). En su mayor parte el servicio parece funcionar bien, pero siempre tan a menudo que las bombas fuera y reinicia sin motivo aparente (gerente administrador está configurado para reiniciar el servicio de accidente).

Estoy haciendo sustancial registro de eventos , y tengo un enfoque por capas Tratamiento de excepciones que creo que hace que al menos algún tipo de sentido :

  • En esencia Tengo los nivel superior de excepción genérica, de excepción nula y sin excepción inicio manipuladores.
  • Luego me dieron varios controladores en el " Nivel de comando " (es decir, las acciones específicas que se ejecuta el servicio)
  • Finalmente puedo manejar unas pocas excepciones que se manejan en el nivel de clase

He estado mirando si los recursos no se liberan correctamente, y estoy empezando a sospechar que mi código de correo (enviar correo electrónico). Me di cuenta de que yo no estaba llamando Disponer para el objeto MailMessage , y ahora he vuelto a escribir el código de Sendmail como se ilustra a continuación.

La pregunta básica es:

  • será el código liberar adecuadamente todos los recursos utilizados para enviar correos?
  • No veo una forma de disponer del objeto SmtpClient ?
  • (para el registro: No estoy usando inicializador de objeto para que la muestra más fácil de leer)
    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);
        }
    }
¿Fue útil?

Solución

Sé que esta pregunta es pre .Net 4, pero la versión 4 ahora es compatible con un método Dispose que envía correctamente un renunció al servidor SMTP. Vea la MSDN referencia y < a href = "https://stackoverflow.com/questions/2781103/c-how-to-correctly-dispose-of-an-smtpclient"> una pregunta stackOverflow nueva .

Otros consejos

Hay problemas documentados con la clase SmtpClient. Yo recomiendo la compra de un control de terceros, ya que no son demasiado caros. Chilkat hace una decente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top