Bestimmte Aktionen, die Benutzer meiner Website ausführen, führen zum Senden von E-Mails. Der Code, der E-Mails sendet, kann für eine Weile blockieren, also möchte ich dies aus dem Thread ihres HTTP-Anforderungshandlers heraus tun.
Momentan verwende ich etwas wie:
%Vor%Zum größten Teil funktioniert das. Die Website wird jedoch in einer gehosteten Umgebung ausgeführt, in der der App-Pool wiederverwendet werden kann.
Ab und zu erhalte ich keine E-Mail, die gesendet werden sollte, und ich vermute, dass dieses Arbeitselement in der Warteschlange des Threadpools beim Recycling des Anwendungspools gelöscht wird.
Wie kann ich eine solche Ansync-Operation durchführen und sicherstellen, dass sie in einem solchen Fall abgeschlossen wird?
Wenn Ihre Anwendung im integrierten Modus ausgeführt wird, können Sie Ihren Mail-Dispatcher-Dienst in der Host-Umgebung registrieren. Der Host benachrichtigt Ihren Dienst , bevor ein Recycling durchgeführt wird.
Es führt 2 Aufrufe für Ihre Implementierung von IRegisteredObject.Stop
aus. Beim ersten Anruf gibt der Host Ihnen die Möglichkeit, den Job zu beenden. Wenn das Zeitlimit erreicht ist und Ihr Dienst sich nicht vom Host entfernt hat, wird ein weiterer Anruf getätigt, aber dieses Mal nur, um mitzuteilen, dass das Recycling mit oder ohne die Zustimmung des Dienstes durchgeführt wird.
Dies ist ein Beispiel (nicht getestet), wie Sie die Stop () Methode implementieren können:
%Vor%Starten Sie den Dienst und registrieren Sie ihn auf dem Host.
%Vor%Die beste Option wäre hier die Verwendung einer persistenten Nachrichtenwarteschlange oder eines Dienstbusses. Ihre App schreibt die E-Mail-Anfrage in die Warteschlange, der Warteschlangen-Handler (der Ihre Web-App sein könnte) liest die Warteschlange und verarbeitet die Nachricht. Wenn die Dinge sterben, beginnt der Persistenzwinkel - die Nachrichten hängen herum, bis sie verarbeitet werden können.
Tags und Links .net iis asynchronous threadpool