Corretamente descartar recursos utilizados pelo SmtpClient
-
13-09-2019 - |
Pergunta
Eu tenho um C serviço # que é executado continuamente com credenciais de utilizador (isto é, não como localsystem - Eu não posso mudar isso, porém eu quero). Para a maior parte do serviço parece estar a correr bem, mas sempre tão frequentemente que bombas fora e reinicia sem motivo aparente (gerente de servicer está definido para o serviço de reinício no acidente).
Estou fazendo registro de eventos substancial , e eu tenho uma abordagem em camadas para A manipulação de exceção que eu acredito que faz pelo menos algum tipo de sentido :
- Essencialmente eu tenho o nível superior exceção genérica, exceção nula e manipuladores de exceção de inicialização.
- Então eu tenho vários manipuladores no " nível de comando" (ações específicas i.e que o serviço é executado)
- Finalmente eu lidar com algumas exceções movimentados no nível de classe
Eu tenho procurado para saber se os recursos não são liberados corretamente, e eu estou começando a suspeitar que meu código postal (envio de e-mail). Percebi que eu não estava chamando Dispose para o objeto MailMessage , e eu já reescrito o código SendMail como ilustrado abaixo.
O pergunta básica é a seguinte:
- este código liberar corretamente todos os recursos utilizados para enviar e-mails?
- não vejo uma maneira de Elimine do objeto SmtpClient ?
- (para o registro: Eu não estou usando de inicialização do objeto para fazer a amostra mais fácil de ler)
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);
}
}
Solução
Eu sei que esta questão é pré .Net 4, mas a versão 4 agora suporta um método Dispose que corretamente envia uma saia para o servidor SMTP. Veja a e referência MSDN < a href = "https://stackoverflow.com/questions/2781103/c-how-to-correctly-dispose-of-an-smtpclient"> uma pergunta stackoverflow mais recente .
Outras dicas
Há problemas documentados com a classe SmtpClient. Eu recomendo a compra de um controle de terceiros, uma vez que não são muito caras. Chilkat faz um decente.