Question

Je C # Service fonctionne en continu avec les informations d'identification de l'utilisateur (i.e. pas localsystem - Je ne peux pas changer ce que je veux). Pour la plupart le service semble fonctionner ok, mais jamais si souvent des bombes sur et redémarre sans raison apparente (gestionnaire de prestataire de service est configuré pour redémarrer le service sur le crash).

Je suis en train de faire substantiel l'enregistrement des événements , et j'ai un approche à plusieurs niveaux Gestion des exceptions que je crois fait au moins une sorte de sens :

  • Essentiellement, je suis top exception générique, exception nulle et les gestionnaires de démarrage exception.
  • Je suis différents gestionnaires à la " Niveau de commande " (i.e. actions spécifiques que le service fonctionne)
  • Enfin je gère quelques exceptions traitées au niveau de la classe

J'ai cherché à savoir si les ressources ne sont pas correctement libérés, et je commence à soupçonner mon code postale (envoyez un courriel). J'ai remarqué que je ne demande pas prédisposer à la, et je l'ai maintenant réécrit le code SendMail objet MailMessage comme illustré ci-dessous.

question fondamentale est:

  • ce code correctement libérer toutes les ressources utilisées pour envoyer des mails?
  • Je ne vois pas un moyen de Éliminez objet SmtpClient ?
  • (pour mémoire: Je n'utilise pas initialiseur d'objet pour rendre l'échantillon plus facile à lire)
    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);
        }
    }
Était-ce utile?

La solution

Je sais que cette question est avant .Net 4, mais la version 4 supporte maintenant une méthode Dispose qui envoie correctement un quit au serveur SMPT. Voir la msdn de référence et < a href = "https://stackoverflow.com/questions/2781103/c-how-to-correctly-dispose-of-an-smtpclient"> une question plus récente stackoverflow .

Autres conseils

Il y a problèmes documentés avec la classe SmtpClient. Je recommande l'achat d'un contrôle par des tiers car ils ne sont pas trop chers. Chilkat fait un décent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top