2013-09-04 12 views
23

system.net.mail.smtpclientには、私が非常に混乱している2つの方法があります。これらの2つの方法の違いは何ですか?

1。 SendAsync(はMailMessage、Object)を

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

それが過負荷でないように、2つのメソッドの名前が異なることに注意してください。ここでの違いは何ですか?

両方の方法については、MSDNでの説明は非常に曖昧であるように私は(少なくとも私にとってはそれがある。)非常に明確な答えを探しています

+1

は 'SendMailAsync'は新しい' async'機能で動作するように 'SendAsync'をラップします。 –

答えて

21

違いはSendMailAsyncが新しいasync/await技術を使用し、他の1であります古いコールバック技術を使用します。さらに重要なことに、渡されたObjectは、メソッドが完了すると、単にイベントハンドラにuserStateとして渡されます。

+6

より良い:SendMailAsyncはタスクを返します。あなたが待っているかどうかにかかわらず、あなたの呼び出しです。 – usr

+1

@ usr、それはよく言われています。あなたは確かに待つ必要はありません。 –

+0

私は、他の人に比べて、どんな利点があるのか​​知りたいですか?私はSendMailAsyncがより良いと仮定しています –

7

まず、両方とも非同期で動作します。

ただし、SendAsyncは.NET 2以降存在していました。新しいタスクシステムSendMailAsyncをサポートしながら、下位互換性を維持するために追加されました。

SendMailAsyncTaskではなくvoidを返し、必要に応じてSmtpClientは新しいasyncawait機能をサポートすることができます。 SendAsync 詳細情報について

+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; } 
     } 
    } 
} 
関連する問題