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