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);
        }
    }
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top