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);
        }
    }
Foi útil?

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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top