这两种方法有啥区别?

Posted

技术标签:

【中文标题】这两种方法有啥区别?【英文标题】:what is the difference between these two methods?这两种方法有什么区别? 【发布时间】:2013-09-08 01:07:18 【问题描述】:

system.net.mail.smtpclient 有两种我很困惑的方法。

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

请注意,两个方法的名称不同,因此它不是重载。这里到底有什么区别?

我正在寻找非常明确的答案,因为 MSDN 对这两种方法的描述非常模棱两可(至少对我来说是这样)。

【问题讨论】:

SendMailAsync 包装 SendAsync 以使用新的 async 功能。 【参考方案1】:

区别在于一个SendMailAsync使用了新的async/await技术,另一个使用了旧的回调技术。更重要的是,当方法完成时,传递的Object 只是作为userState 传递到事件处理程序中。

【讨论】:

更好的说法是:SendMailAsync 返回一个任务。是否使用 await 由您决定。 @usr,说得好。你当然不必await 我想知道一个比另一个有什么好处?我假设 SendMailAsync 更好 @bilalfazlani,两者没有优势。它们是可供您使用的工具。如果因为您使用async/await 方法而使您的应用程序更适用于您的应用程序,那么请使用SendMailAsync 方法。如果不这样做,只需连接对象上的回调并调用SendAsync 方法。两者都是完全有效的。 @neoistheone 最后一个问题。在这两种方法中,用于异步执行工作的线程是否会从线程池中消耗?【参考方案2】:

首先,它们都是异步工作的。

但是,SendAsync 自 .NET 2 以来就存在。为了保持向后兼容性,同时支持新的任务系统,添加了 SendMailAsync

SendMailAsync 返回Task 而不是void,并允许SmtpClient 支持新的asyncawait 功能(如果需要)。

【讨论】:

两者都在异步工作。我想知道一个比另一个有什么好处?【参考方案3】:
  //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; 
        
    

【讨论】:

【参考方案4】:

SendMailAsyncSendAsync 的简单 TAP 包装器 更多信息:Are the SmtpClient.SendMailAsync methods Thread Safe?

【讨论】:

以上是关于这两种方法有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

C ++中这两种强制转换方法有啥区别? [复制]

这两种方法有啥区别?是啥让第二个比第一个更好?

K均值聚类法和系统聚类法有啥区别,这两种聚类方法的适用条件都是啥?

这两种符号有啥区别?

在C++种,关于指针的这两种表示有啥区别:double * a和double ** a?两个**是啥意思呢?

这两种类型的闭包有啥区别?