2013-01-25 39 views
5

पढ़ना मैंने एक ऐसा एप्लीकेशन विकसित किया है जो मुख्य रूप से ईमेल संदेश भेजता है SMTP का उपयोग करता है। संदेशों को एक-एक करके भेजना ठीक है, हालांकि मैं प्रक्रिया को गति देने के लिए देख रहा हूं। मैंने SmtpClient के साथ-साथ संदेशों को एक दूसरे के बीच संघर्ष से बचने के कई उदाहरण बनाए हैं। अलग-अलग उदाहरणों के कारण, मुझे लगता है कि एकाधिक धागे पर .Send() प्रदर्शन करना अच्छा काम करेगा। हालांकि, मेरे Thread कोड के साथ कुछ काम नहीं कर रहा है, क्योंकि मैं इस कोड का उपयोग करके एक थ्रेड पर भी एक ईमेल नहीं भेज सकता। मैं बस एक अस्पष्ट "Failure sending mail" अपवाद प्राप्त करता हूं। मैं काम करता हूं जो कोड पोस्ट करेगा, और Thread जो काम नहीं करता है। क्या कोई यह साझा कर सकता है कि उनका क्या कारण हो सकता है?सी # सिस्टम का उपयोग कर एसएमटीपी भेज रहा है।

नोट मैं वर्तमान में नए async क्षमताओं का उपयोग करने के लिए देख नहीं कर रहा हूँ, लेकिन इसके बजाय लाभ Thread

कार्य घोषणा और विधि कॉल:

var SMTP = new SmtpClient 
    { 
     Host = txtBxSenderHost.Text, 
     Port = 587, 
     EnableSsl = true, 
     DeliveryMethod = SmtpDeliveryMethod.Network, 
     UseDefaultCredentials = false, 
     Credentials = new NetworkCredential(strSenderAddress, strSenderPassword) 
    }; 

using (var message = new MailMessage(senderAdrress, toAddress) 
    { 
     Subject = strSubject, 
     Body = strBody 
    }) 

    { 
     SMTP.Send(message); 
    } 

काम नहीं कर रहा थ्रेड घोषणा और विधि कॉल:

var SMTP = new SmtpClient 
    { 
     Host = txtBxSenderHost.Text, 
     Port = 587, 
     EnableSsl = true, 
     DeliveryMethod = SmtpDeliveryMethod.Network, 
     UseDefaultCredentials = false, 
     Credentials = new NetworkCredential(strSenderAddress, strSenderPassword) 
    }; 

using (var message = new MailMessage(senderAdrress, toAddress) 
    { 
     Subject = strSubject, 
     Body = strBody 
    }) 

    { 
     Thread T1 = new Thread(delegate() { SMTP.Send(message); }); 
     T1.Start(); 
    } 
+0

आप के लिए एक 'using' ब्लॉक के अंदर' नई Thread' है 'message' साथ जीवन को आसान बना देता है? इस तरह, नए धागे को भेजने से पहले संदेश का निपटान होने की संभावना है। –

+0

अपनी कार्यवाही घोषणा और कार्य विधि को किसी अन्य विधि में लपेटें और फिर उस विधि का उपयोग थ्रेड – nsconnector

+0

में करें। क्या आप थोड़ा और विस्तार कर सकते हैं? मैं यह भी सुनिश्चित नहीं कर रहा हूं कि नए धागे को भेजने से पहले इसका निपटारा किया जा रहा है, परीक्षण के लिए मैं केवल एक थ्रेड का उपयोग कर रहा हूं। मैं यहां से भी रास्ता निकाल सकता हूं, मुझे उम्मीद है कि आप मेरे साथ बेकार हो सकते हैं। – scniro

उत्तर

11

हल:

var SMTP = new SmtpClient 
     { 
      Host = txtBxSenderHost.Text, 
      Port = 587, 
      EnableSsl = true, 
      DeliveryMethod = SmtpDeliveryMethod.Network, 
      UseDefaultCredentials = false, 
      Credentials = new NetworkCredential(strSenderAddress, strSenderPassword) 
     }; 

     Thread T1 = new Thread(delegate() 
     { 
      using (var message = new MailMessage(senderAdrress, toAddress) 
      { 
       Subject = strSubject, 
       Body = strBody 
      }) 
      { 
       { 
        SMTP.Send(message); 
       } 
      } 
     }); 

     T1.Start(); 
+0

@nsconnector अगर नया थ्रेड (...), टी 1 में अपवाद होता है।प्रारंभ() एक अपवाद शुरू या फेंक देगा? –

+0

*** त्रुटि हैंडलिंग ***? –

1

क्यों न सिर्फ Smtp.SendAsync विधि का उपयोग करें?

http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx

+4

क्योंकि SendAsync अभी भी यूआई थ्रेड को अवरुद्ध करता है और कभी-कभी आप नहीं चाहते कि उपयोगकर्ता को इसका इंतजार करना पड़े। तो आप उन्हें पृष्ठभूमि थ्रेड पर भेजते हैं। –

+0

@BradBamford *** SendAsync *** के बिना बेहतर समाधान और कोड नमूना? –

2

आप यह भी सब कुछ पहले से परिभाषित करने और नया थ्रेड सिर्फ फोन करके आसान कर सकते हैं।

//define everything above 

Thread t1 = new Thread(delegate() 
{ 

    SMTP.send(message); 

}); 

t1.Start(); 

Thats मैं क्या किया था और यह उन घुंघराले ब्रेसिज़