2011-11-29 10 views
8

जब भी मैं से smtpClient.SendAsync(...) फोन मेरी ASP.NET MVC आवेदन के भीतर, अतुल्यकालिक अनुरोध स्वचालित रूप से रद्द कर रहे हैं, भले ही SendAsyncCancel() कभी नहीं कहा जाता है।SmtpClient.SendAsync कॉल स्वचालित रूप से रद्द कर रहे हैं

सिंक्रोनस.Send(...) अनुरोध, दूसरी तरफ, ठीक है।

मेरे EmailService सेवा आवरण मेरी ASP.NET MVC 3 आवेदन के भीतर से SmtpClient साथ अतुल्यकालिक ईमेल भेजने संभालती है। स्ट्रक्चर मैप द्वारा प्रत्येक एमवीसी नियंत्रक में एक सेवा उदाहरण इंजेक्शन दिया जाता है, जो using (...) { } कथन में एक नया SmtpClient उदाहरण लपेटता है।

यहाँ SmtpClient के लिए मेरे EmailService.SendAsync आवरण विधि है:

public void SendAsync(EmailMessage message) 
{ 
    try 
    { 
     using (var smtpClient = new SmtpClient(_cfg.Host, _cfg.Port) 
     { 
      EnableSsl = _cfg.EnableSsl, 
      Credentials = _credentials 
     }) 
     { 
      smtpClient.SendCompleted += new SendCompletedEventHandler(Email_OnCompleted); 

      var mailMessage = new MailMessage(message.From, message.To) 
           { 
            Subject = message.Subject, 
            Body = message.Body 
           }; 

      smtpClient.SendAsync(mailMessage, message); 

      _logger.Info(string.Format("Sending async email to {0} with subject [{1}]", message.To, message.Subject)); 
     } 
    } 
    catch (Exception ex) 
    { 
     _logger.Error("Async email error: " + ex); 
     throw; 
    } 

} 

यहाँ मेरी Email_OnCompleted प्रतिनिधि है:

public void Email_OnCompleted(object sender, AsyncCompletedEventArgs e) 
{ 
    var mail = (EmailMessage)e.UserState; 

    if (e.Error != null) 
    { 
     _logger.Error(string.Format("Error sending email to {0} with subject [{1}]: {2}", mail.To, mail.Subject, e.Error)); 
    } 
    else if (e.Cancelled) 
    { 
     _logger.Warn(string.Format("Cancelled email to {0} with subject [{1}].", mail.To, mail.Subject)); 
    } 
    else 
    { 
     _logger.Info(string.Format("Sent email to {0} with subject [{1}].", mail.To, mail.Subject)); 
    } 
} 

क्यों async ईमेल रद्द किया जा रहा हैं, लेकिन तुल्यकालिक ईमेल ठीक माध्यम से जाना? क्या यह एक निपटान मुद्दा हो सकता है?

उत्तर

12

यह निश्चित रूप से एक निपटान मुद्दा हो सकता है। जब आप क्लाइंट का निपटान करते हैं तो यह किसी भी उत्कृष्ट एसिंक ऑपरेशंस को रद्द करता है।

आपको क्लाइंट को Email_OnCompleted में निपटाना चाहिए।

एक अतः जहां निपटान के लिए पर पोस्ट: Dispose SmtpClient in SendComplete?

+2

बहुत खूब! मैं उपयोग (...) कथन और async भेज रहा है अब पूरी तरह से काम करता है। धन्यवाद, एंडर्स! –

+0

क्या यह संभव है कि एसिंक भेजने से पहले नियंत्रक को _logger के साथ निपटान किया जाएगा, जिसके परिणामस्वरूप ILogger इंस्टेंस पर एक शून्य संदर्भ अपवाद हो सकता है? –

+1

अधिक सटीक ... "जब आप क्लाइंट का निपटान करते हैं तो यह किसी भी उत्कृष्ट एसिंक ऑपरेशंस को रद्द कर देता है।" = जब आप SmtpClient का निपटान करते हैं तो यह वर्ग के उदाहरण के लिए किसी भी उत्कृष्ट एसिंक ऑपरेशंस को रद्द करता है। –