Corretto smaltimento risorse utilizzate da SmtpClient
-
13-09-2019 - |
Domanda
Ho un servizio # C che corre continuamente con credenziali utente (cioè non come LocalSystem - Non posso cambiare questo però voglio). Per la maggior parte il servizio sembra funzionare bene, ma mai così spesso che le bombe fuori e si riavvia per nessun motivo apparente (direttore di servicer è impostato per riavviare il servizio in crash).
che sto facendo sostanziale la registrazione degli eventi , e ho un approccio stratificato a Gestione delle eccezioni che credo che rende almeno un qualche tipo di senso :
- In sostanza ho ottenuto i gestori di livello superiore di eccezione generica, eccezione nullo e di eccezione di avvio.
- Poi ho avuto vari gestori ai " livello di comando " (azioni specifiche che cioè il servizio viene eseguito)
- Infine mi occupo di alcune eccezioni gestite presso il livello di classe
Sono stato a guardare se eventuali risorse non sono adeguatamente rilasciati, e sto iniziando a sospettare il mio codice postale (inviare e-mail). Ho notato che non stavo chiamando Dispose per il MailMessage oggetto , e ora ho riscritto il codice SendMail come illustrato di seguito.
Il questione di fondo è:
- sarà questo codice rilasciare correttamente tutte le risorse utilizzate per inviare mail?
- Non vedo un modo per Smaltire del oggetto SmtpClient
- (per la cronaca: non sto usando di inizializzazione degli oggetti per rendere il campione più facile da leggere)
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);
}
}
Soluzione
So che questa domanda è pre .Net 4 ma la versione 4 ora supporta un metodo Dispose che invia correttamente un uscire al server SMPT. Vedere la MSDN di riferimento e < a href = "https://stackoverflow.com/questions/2781103/c-how-to-correctly-dispose-of-an-smtpclient"> una più recente StackOverflow domanda .
Altri suggerimenti
Ci sono problemi documentati con la classe SmtpClient. Vi consiglio di acquistare un controllo di terza parte in quanto non sono troppo costosi. Chilkat fa una decente.