2013-09-04 13 views
23

system.net.mail.smtpclient ma dwie metody, dla których jestem bardzo zdezorientowany.Jaka jest różnica między tymi dwoma metodami?

1. SendAsync (MailMessage, obiekt)

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

Należy zauważyć, że te nazwy dwie metody różnią się, tak że nie jest to przeciążenia. Czym dokładnie jest ta różnica?

szukam bardzo jasnej odpowiedzi co do opisu podanego przez MSDN dla obu metod jest bardzo niejednoznaczne (przynajmniej dla mnie jest.)

+1

'' SendAsync' SendMailAsync' zawija do pracy z nowymi funkcjami async' '. –

Odpowiedz

21

Różnica jest jedna SendMailAsync używa nowego async/await technologii i drugi korzysta ze starej technologii oddzwaniania. Co ważniejsze, przekazana Object jest po prostu przekazywana do programu obsługi zdarzeń jako userState po zakończeniu tej metody.

+6

Lepiej powiedziane: SendMailAsync zwraca zadanie. Nieważne, czy korzystasz z wyczekiwania, czy nie, jest twój telefon. – usr

+1

@usr, dobrze o tym powiedziałem. Na pewno nie musisz "czekać". –

+0

Chcę wiedzieć, jaka jest korzyść jednej nad drugą? Zakładam, że SendMailAsync jest lepsza. –

7

Po pierwsze oba działają asynchronicznie.

Jednak SendAsync istnieje od .NET 2. Aby zachować kompatybilność wsteczną przy jednoczesnym dodaniu nowego systemu Zadania dodano SendMailAsync.

SendMailAsync zwraca Task zamiast void i pozwala SmtpClient do wspierania nowych async i await funkcjonalność jeśli jest to wymagane.

+0

Oba działają asynchronicznie. Chcę wiedzieć, jaka jest korzyść jednej z drugiej? –

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; } 
     } 
    } 
} 
Powiązane problemy