6 Stimmen

Ordnungsgemäße Entsorgung der von SmtpClient verwendeten Ressourcen

Ich habe eine C#-Dienst que läuft kontinuierlich mit Benutzeranmeldeinformationen (d. h. nicht als localsystem - ich kann dies nicht ändern, obwohl ich es möchte). Meistens scheint der Dienst gut zu laufen, aber hin und wieder stürzt er ab und startet ohne ersichtlichen Grund neu (Servicer Manager ist so eingestellt, dass der Dienst bei einem Absturz neu gestartet wird).

Ich tue viel Ereignisprotokollierung und ich habe eine mehrschichtiger Ansatz à Behandlung von Ausnahmen die meiner Meinung nach zumindest einen gewissen Sinn ergeben:

  • Im Wesentlichen habe ich die oberste Ebene Handler für generische Ausnahmen, Null-Ausnahmen und Startausnahmen.
  • Dann habe ich verschiedene Handler bei der " Kommandoebene " (d. h. bestimmte Aktionen, die der Dienst ausführt)
  • Schließlich behandle ich noch einige Ausnahmen, die in der Klassenstufe

Ich habe untersucht, ob Ressourcen nicht ordnungsgemäß freigegeben werden, und ich fange an, meinen Mailing-Code (E-Mail senden) zu verdächtigen. Mir ist aufgefallen, dass ich Dispose nicht für die MailMessage-Objekt und ich habe jetzt den SendMail-Code wie unten dargestellt umgeschrieben.

Le site grundlegende Frage ist:

  • Werden mit diesem Code alle für den Versand von E-Mails verwendeten Ressourcen ordnungsgemäß freigegeben?
  • Ich sehe keine Möglichkeit, die entsorgen der SmtpClient-Objekt ?
  • (für das Protokoll: Ich verwende keine Objektinitialisierung, um das Beispiel leichter lesbar zu machen)

    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);
        }
    }

5voto

Jeff Punkte 332

Ich weiß, diese Frage ist vor .Net 4, aber Version 4 unterstützt jetzt eine Dispose-Methode, die ordnungsgemäß ein Quit an den Smpt-Server sendet. Siehe die msdn-Referenz y eine neuere Stackoverflow-Frage .

1voto

Spencer Ruport Punkte 34547

Es gibt dokumentierte Probleme mit der Klasse SmtpClient. Ich empfehle den Kauf eines Drittanbieters Kontrolle, da sie nicht zu teuer sind. Chilkat macht eine anständige ein.

0 Stimmen

Danke für die Information - das muss ich mir vielleicht mal ansehen. Es ist seltsam, dass das MailMessage-Objekt IDisposable implementiert, aber der SmtpClient tut nicht.

0 Stimmen

Ja, ja. Unter diesem Link scheint es eine Lösung zu geben. Vielleicht möchten Sie das ausprobieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X