यहां सरल अवधारणा। यह एमवीसी 3 और एंटिटी फ्रेमवर्क 4 का उपयोग करके बनाई जा रही साइट के लिए है। उपयोगकर्ता द्वारा साइट पर पंजीकरण करने के बाद, उनके ईमेल पते पर एक ईमेल भेजा जाता है। मैंने सबसे पहले SmtpClient.Send() का उपयोग करके इसे कार्यान्वित किया और यह ठीक काम किया। तब मुझे ईमेल को अतुल्यकालिक रूप से भेजने का प्रयास करने का उज्ज्वल विचार मिला। मुझे दो एसिंक दृष्टिकोणों के साथ समस्याएं आ रही हैं जिनकी मैंने कोशिश की है।SmtpClient के माध्यम से असीमित रूप से ईमेल भेजने के दो तरीके, विभिन्न परिणाम
पहले कार्यान्वयन (यह अनुत्तरित पद से: https://stackoverflow.com/questions/7558582/how-to-dispose-using-smtpclient-send-and-asynccallback):
public bool Emailer(){
.
.
.
using (var smtpClient = new SmtpClient())
{
smtpClient.EnableSsl = true;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("[email protected]", "mypassword");
var sd = new SendEmailDelegate(smtpClient.Send);
var cb = new AsyncCallback(SendEmailResponse);
sd.BeginInvoke(message, cb, sd);
return true;
}
}
private delegate void SendEmailDelegate(System.Net.Mail.MailMessage m);
private static void SendEmailResponse(IAsyncResult ar)
{
try
{
SendEmailDelegate sd = (SendEmailDelegate)(ar.AsyncState);
sd.EndInvoke(ar); // "cannot access a disposed object" errors here
}
catch (Exception e)
{
_logger.WarnException("Error on EndInvoke.", e);
}
}
यह आधे समय में काम किया। दूसरी छमाही मुझे कॉलबैक में "एक डिस्पोजेड ऑब्जेक्ट तक नहीं पहुंच सकता" त्रुटि प्राप्त होगी।
अगला कार्यान्वयन (ठोस प्रतिष्ठा के साथ एक सदस्य से: What are best practices for using SmtpClient, SendAsync and Dispose under .NET 4.0):
var smtpClient = new SmtpClient();
smtpClient.EnableSsl = true;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("[email protected]", "mypassword");
smtpClient.SendCompleted += (s, e) =>
{
smtpClient.Dispose();
message.Dispose();
};
smtpClient.SendAsync(message, null);
इस कार्यान्वयन मैं किसी भी त्रुटि मिल न के साथ
, लेकिन वहाँ एक काफ़ी लंबे समय तक देरी (~ 5 सेकंड) डिबगिंग मोड SmtpClient में जब है। SendAsync() निष्पादित करता है, जिससे मुझे लगता है कि यह अतुल्यकालिक रूप से नहीं भेजा जा रहा है।
सवाल:
1) क्या पहली विधि है कि "निपटाए वस्तु" त्रुटियों के कारण में गलत क्या है?
2) क्या दूसरे कार्यान्वयन में ऐसी समस्या है जो ईमेल को असीमित रूप से नहीं भेज रहा है? 5-सेकंड देरी अर्थहीन है?
यह भी ध्यान रखना महत्वपूर्ण हो सकता है कि हालांकि साइट को बड़ी संख्या में ईमेल भेजने (केवल उपयोगकर्ता पंजीकरण, ऑप्ट-इन न्यूज़लेटर्स इत्यादि) भेजने में सहायता करने की आवश्यकता नहीं होगी, हम भविष्य में बड़ी संख्या में उपयोगकर्ताओं की उम्मीद करते हैं, इसलिए ईमेल को असीमित रूप से भेजने का मेरा निर्णय।
धन्यवाद।
उत्तर के लिए धन्यवाद। अब मैं देखता हूं कि हैंडलर को आग लगाने का मौका देने से पहले ऑब्जेक्ट का निपटारा किया जाता है। साथ ही, मैं समझता हूं कि दोनों SmtpClient का निपटान किया जाना चाहिए और EndInvoke को कॉल किया जाना चाहिए। क्या दृष्टिकोण # 2 इसे पूरा करता है? –