Zwei Möglichkeiten zum Senden von E-Mails über SmtpClient asynchron, unterschiedliche Ergebnisse

8

Einfaches Konzept hier. Dies ist für eine Site, die mit MVC 3 und Entity Framework 4 erstellt wird. Nachdem sich ein Benutzer auf der Site registriert hat, wird eine E-Mail an seine E-Mail-Adresse gesendet. Ich habe dies zuerst mit SmtpClient.Send () implementiert und es hat gut funktioniert. Dann bekam ich die gute Idee, die E-Mail asynchron zu senden. Ich habe Probleme mit den beiden asynchronen Vorgehensweisen, die ich versucht habe.

Erste Implementierung (aus diesem unbeantworteten Beitrag: Ссылка ):

%Vor%

Das hat die halbe Zeit geklappt. Die andere Hälfte würde ich einen Fehler bekommen "Kann nicht auf ein entsorgtes Objekt zugreifen" Fehler im CallBack.

Nächste Implementierung (von einem Mitglied mit solider Reputation: Was sind Best Practices für die Verwendung von SmtpClient, SendAsync und Dispose unter .NET 4.0 ):

%Vor%

Mit dieser Implementierung bekomme ich keine Fehler, aber es gibt eine merklich längere Verzögerung (~ 5 Sekunden) im Debugging-Modus, wenn smtpClient.SendAsync () ausgeführt wird, was zu der Annahme führt, dass es nicht asynchron gesendet wird.

Fragen:

1) Was ist falsch in der ersten Methode, die die Fehler "beseitigte Objekt" verursacht?

2) Hat die zweite Implementierung ein Problem, das dazu führt, dass die E-Mail nicht asynchron gesendet wird? Ist die Verzögerung von 5 Sekunden bedeutungslos?

Es kann auch wichtig sein zu beachten, dass die Website zwar nicht das Senden einer großen Anzahl von E-Mails unterstützen muss (nur Benutzerregistrierung, Opt-In-Newsletter usw.), wir erwarten jedoch in Zukunft eine große Anzahl von Benutzern meine Entscheidung, E-Mails asynchron zu senden.

Danke.

    
John L 07.01.2012, 10:04
quelle

3 Antworten

7

Ihre erste Methode funktioniert wegen des USING-Blocks nicht richtig. Nachdem der using-Block beendet ist, wird das SmtpClient-Objekt entfernt. Sie können also in Ihrem Event-Handler keinen Zugriff darauf erhalten.

    
Mithrandir 07.01.2012, 10:12
quelle
5

Tipps: 1-nicht verwenden "using block" für MailMessage objet, es entsorgen Sie Ihr Objekt vor Mail gesendet werden 2-Dispose MailMessage-Objekte auf SmtpClient.SendCompleted-Ereignis:

%Vor%

3-set SendCompletedEventHandler für das smtpClient-Objekt

%Vor%

4-mehr Code:

%Vor%     
daszarrin 21.04.2012 08:00
quelle
1

SmtpClient.SendAsync ist die bevorzugte Methode für das Senden asynchroner E-Mails, da sie SmtpClient -Methoden verwendet, die speziell für diesen Zweck entwickelt wurden. Es ist auch einfacher zu implementieren und hat sich tausendfach bewährt.

Ihre Verzögerung von 5 Sekunden ist merkwürdig und deutet darauf hin, dass ein Problem vorliegt, das behoben werden muss. Der erste Codeabschnitt deckt das Problem nur auf, beseitigt es aber nicht.

SmtpClient.SendAsync sendet tatsächlich nur dann asynchron, wenn Ihre Liefermethode nicht SpecifiedPickupDirectory oder PickupDirectoryFromIis ist. In diesen Fällen wird die Nachrichtendatei in den Abholordner geschrieben, bevor sie zurückgegeben wird. Überprüfen Sie den Abschnitt <smtp> Ihrer Konfigurationsdatei. Ich vermute, Sie verwenden eine dieser Methoden und das Problem ist mit dem Pickup-Ordner. Löschen Sie alte Dateien, die Sie möglicherweise dort haben, und prüfen Sie, ob das Problem nicht Ihre Antivirus-Software ist, die höchstwahrscheinlich jede neue Datei nach Viren durchsucht. Überprüfen Sie, ob Verschlüsselungs- oder Komprimierungsattribute festgelegt sind. Kann auch etwas anderes sein. Der beste Weg zu testen, ob der Ordner die Ursache der Probleme ist, besteht darin, eine E-Mail-Datei manuell zu verarbeiten.

    
Maciej D. 21.04.2012 09:23
quelle

Tags und Links