Desechar correctamente los recursos utilizados por SmtpClient
-
13-09-2019 - |
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);
}
}
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.