2013-09-04 10 views
23

system.net.mail.smtpclient में दो विधियां हैं जिनके लिए मैं बहुत उलझन में हूं।इन दो तरीकों के बीच क्या अंतर है?

1। SendAsync (MailMessage, वस्तु)

Sends the specified e-mail message to an SMTP server for delivery. This method does not block the calling thread and allows the caller to pass an object to the method that is invoked when the operation completes. -MSDN

2। SendMailAsync (MailMessage)

Sends the specified message to an SMTP server for delivery as an asynchronous operation. -MSDN

सूचना है कि दो तरीकों के नाम अलग हैं, तो यह एक अधिभार नहीं है। यहां अंतर क्या है?

मैं दोनों तरीकों के लिए MSDN द्वारा दिए गए विवरण के रूप में बहुत स्पष्ट उत्तर नहीं रहा हूँ बहुत अस्पष्ट है (कम से कम मेरे लिए है।)

+1

'SendMailAsync' लपेटता' SendAsync' नई 'async' सुविधाओं के साथ काम करने के लिए। –

उत्तर

21

अंतर एक SendMailAsync नई async/await प्रौद्योगिकी और अन्य का उपयोग करता है पुरानी कॉलबैक तकनीक का उपयोग करता है। और सबसे महत्वपूर्ण बात यह है कि Object पारित होने पर विधि पूर्ण होने पर userState के रूप में ईवेंट हैंडलर में बस पारित किया जाता है।

+6

बेहतर कहा: SendMailAsync एक कार्य देता है। चाहे आप प्रतीक्षा करें या नहीं, आपका कॉल है। – usr

+1

@usr, उस पर अच्छी तरह से कहा। आपको निश्चित रूप से कभी भी 'प्रतीक्षा' नहीं करना है। –

+0

मैं जानना चाहता हूं कि दूसरे के ऊपर क्या लाभ है? मुझे लगता है कि SendMailAsync बेहतर –

7

सबसे पहले, वे दोनों असीमित रूप से काम करते हैं।

हालांकि, SendAsync .NET 2 के बाद से अस्तित्व में है। नई कार्य प्रणाली SendMailAsync का समर्थन करते हुए पिछड़ा संगतता बनाए रखने के लिए।

SendMailAsync एक Task बजाय void वापस आती है और SmtpClient नई async और await कार्यक्षमता का समर्थन करने के लिए यदि आवश्यक अनुमति देता है।

+0

दोनों अतुल्यकालिक काम कर रहे हैं। मैं जानना चाहता हूं कि दूसरे पर एक का क्या फायदा है? –

0
//SendAsync 
public class MailHelper 
{ 

    public void SendMail(string mailfrom, string mailto, string body, string subject) 
    { 
     MailMessage MyMail = new MailMessage(); 
     MyMail.From = new MailAddress(mailfrom); 
     MyMail.To.Add(mailto); 
     MyMail.Subject = subject; 
     MyMail.IsBodyHtml = true; 
     MyMail.Body = body; 
     MyMail.Priority = MailPriority.Normal; 

     SmtpClient smtpMailObj = new SmtpClient(); 
     /*Setting*/ 
     object userState = MyMail; 
     smtpMailObj.SendCompleted += new SendCompletedEventHandler(SmtpClient_OnCompleted); 
     try 
     { 
      smtpMailObj.SendAsync(MyMail, userState); 
     } 
     catch (Exception ex) { /* exception handling code here */ } 
    } 

    public static void SmtpClient_OnCompleted(object sender, AsyncCompletedEventArgs e) 
    { 
     //Get the Original MailMessage object 
     MailMessage mail = (MailMessage)e.UserState; 

     //write out the subject 
     string subject = mail.Subject; 

     if (e.Cancelled) 
     { 
      Console.WriteLine("Send canceled for mail with subject [{0}].", subject); 
     } 
     if (e.Error != null) 
     { 
      Console.WriteLine("Error {1} occurred when sending mail [{0}] ", subject, e.Error.ToString()); 
     } 
     else 
     { 
      Console.WriteLine("Message [{0}] sent.", subject); 
     } 
    } 

    // 

} 

//SendMailAsync 
public class MailHelper 
{ 
    // 
    public async Task<bool> SendMailAsync(string mailfrom, string mailto, string body, string subject) 
    { 
     MailMessage MyMail = new MailMessage(); 
     MyMail.From = new MailAddress(mailfrom); 
     MyMail.To.Add(mailto); 
     MyMail.Subject = subject; 
     MyMail.IsBodyHtml = true; 
     MyMail.Body = body; 
     MyMail.Priority = MailPriority.Normal; 

     using (SmtpClient smtpMailObj = new SmtpClient()) 
     { 
      /*Setting*/ 
      try 
      { 
       await smtpMailObj.SendMailAsync(MyMail); 
       return true; 
      } 
      catch (Exception ex) { /* exception handling code here */ return false; } 
     } 
    } 
} 
संबंधित मुद्दे