2013-10-04 7 views
8

लंबित था पूरा मैं ईमेल करने के लिए निम्नलिखित है, जो काम किया था:एक अतुल्यकालिक मॉड्यूल या हैंडलर जबकि एक अतुल्यकालिक आपरेशन अभी भी

private SmtpClient _client = new SmtpClient("smtp.gmail.com", 587) 
    { 
     Credentials = new NetworkCredential("[email protected]", "password"), 
     EnableSsl = true 
    }; 
    public void DoThis(){ 
    _client.Send("[email protected]", to.Email, "Subject", "Body");} 
    public void DoThat(){ 
    _client.Send("[email protected]", to.Email, "Subject", "Body");} 

लेकिन यह वेब एप्लिकेशन को बाधित किया गया था जब तक ईमेल भेजा गया था, तो मैं करने का निर्णय लिया अतुल्यकालिक रूप से भेजने की कोशिश:

public void DoThis(){ 
    var message = new MailMessage("[email protected]", to.Email, "Subject", "Body"); 
    _client.SendAsync(message, null); 
    } 

कौन सा मैं अतुल्यकालिक रूप से इलाज किया जा सकता है देख रही है, तो मैं डिबग, लेकिन मैं हमेशा निम्नलिखित मिलती है:

An asynchronous module or handler completed while an asynchronous operation was still pending.

मैं क्या गलत कर रहा हूँ?

+0

असिंक्रॉनी इस तथ्य को बदलने के लिए कुछ भी नहीं करता है कि आईआईएस के अंदर लंबी चल रही प्रक्रियाओं को संभाला नहीं जाना चाहिए। आपको इसे एक कार्य तालिका में फेंक देना चाहिए और आवर्ती निर्धारित कार्य या विंडोज सेवा इसे चुनना चाहिए। –

+0

@RobVious मुझे एक ही समस्या का सामना करना पड़ रहा है। क्या आप इसे हल करने में सक्षम थे? – Bitsian

+0

@ बिट्सियन हाँ, – RobVious

उत्तर

5

मैं जिस तरह से मेरी Async ईमेल के साथ भेजा जाता है दोबारा काम समाप्त हो गया है:

public void SendAsyncEmail(MailMessage message) 
     { 

      var client = new SmtpClient("mail.hover.com", 587) 
      { 
       Credentials = new NetworkCredential("[email protected]", "Covert00!"), 
       EnableSsl = false 
      }; 
      client.SendCompleted += (sender, error) => 
      { 
       if (error.Error != null) 
       { 
        // TODO: get this working 
        throw new WarningException("Email Failed to send."); 
       } 
       client.Dispose(); 
       message.Dispose(); 
      }; 
      ThreadPool.QueueUserWorkItem(o => client.SendAsync(message, Tuple.Create(client, message))); 
     } 

ध्यान दें कि यह एक अस्थायी समाधान है, और सही तरीका (ऐसा लगता है) ईमेल को संभालने के लिए कुछ का उपयोग करने के लिए है कि संदेशों को पॉप करने के लिए queue service की एक कार्यकर्ता भूमिका या अन्य विंडोज़ सेवा के साथ जोड़ा गया।

+0

से नीचे मेरा उत्तर देखें - इसे करने का सही तरीका: http://www.aspsnippets.com/Articles/How-to-send-email-Asynchronously-in-ASPNet-using-Background -Tread.aspx – niico

+0

जब मैं इस दृष्टिकोण को आजमाता हूं, तो मुझे यह त्रुटि मिलती है: एक डिस्पोजेड ऑब्जेक्ट तक नहीं पहुंच सकता। ऑब्जेक्ट का नाम: 'System.Net.Mail.SmtpClient'। – thomas

संबंधित मुद्दे