Khi người dùng đăng ký trên trang web của tôi, tôi không thấy lý do tại sao tôi cần phải "chờ" cho smtp đi qua để anh ta nhận được một email kích hoạt.Cách thích hợp để gửi email không đồng bộ trong ASP.NET ... (Tôi có làm đúng không?)
Tôi quyết định tôi muốn khởi chạy mã này không đồng bộ và đó là một cuộc phiêu lưu.
Hãy tưởng tượng tôi có một phương pháp, chẳng hạn như:
private void SendTheMail() { // Stuff }
My đầu tiên mặc dù .. được luồng. Tôi đã làm điều này:
Emailer mailer = new Emailer();
Thread emailThread = new Thread(() => mailer.SendTheMail());
emailThread.Start();
Công trình này ... cho đến khi tôi quyết định kiểm tra khả năng xử lý lỗi. Tôi cố ý phá vỡ địa chỉ máy chủ SMTP trong web.config của tôi và thử nó. Các kết quả đáng sợ là IIS về cơ bản BARFED với một lỗi ngoại lệ unhandled trên w3wp.exe (nó là một cửa sổ lỗi! Cực đoan ...) ELMAH (logger lỗi của tôi) đã không bắt nó và IIS đã được khởi động lại để bất cứ ai trên trang web đã phiên của họ bị xóa. Kết quả hoàn toàn không được chấp nhận!
Suy nghĩ tiếp theo của tôi, là thực hiện một số nghiên cứu về đại biểu không đồng bộ. Điều này dường như làm việc tốt hơn bởi vì các ngoại lệ được xử lý trong đại biểu asynch (không giống như ví dụ thread ở trên). Tuy nhiên, tôi quan tâm nếu tôi làm sai hoặc có thể tôi đang gây ra rò rỉ bộ nhớ.
Đây là những gì tôi đang làm:
Emailer mailer = new Emailer();
AsyncMethodCaller caller = new AsyncMethodCaller(mailer.SendMailInSeperateThread);
caller.BeginInvoke(message, email.EmailId, null, null);
// Never EndInvoke...
Am Tôi làm điều này phải?
Vì vậy, để có quyền này: trong SendTheMail không có xử lý ngoại lệ gì? – rene
Tôi mới bắt đầu làm việc đó. Bên trong, tôi bắt ngoại lệ và gọi elmah logger như thế này: Elmah.ErrorLog.GetDefault (null) .Log (new Error (e)); Điều đó làm các trick. –