这两种方法有什么区别?

37

system.net.mail.smtpclient 有两个方法让我感到非常困惑。

1. SendAsync(MailMessage, Object)

将指定的电子邮件消息发送到 SMTP 服务器以进行传递。此方法不会阻塞调用线程,并允许调用者向方法传递一个对象,在操作完成时调用该对象。 -MSDN

2. SendMailAsync(MailMessage)

以异步操作的形式将指定的消息发送到 SMTP 服务器以进行传递。-MSDN

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

我希望得到非常清晰的答案,因为 MSDN 对这两种方法的描述对我来说非常模糊。


4
SendMailAsyncه°پ装ن؛†SendAsyncن»¥é…چهگˆو–°çڑ„async特و€§ه·¥ن½œم€‚ - Alessandro D'Andria
4个回答

31

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


7
更好的表述是:SendMailAsync返回一个任务。使用await与否取决于您自己的选择。 - usr
1
@usr,说得好。你确实不必“等待”。 - Mike Perrenoud
我想知道一个比另一个的好处是什么?我认为SendMailAsync更好。 - Bilal Fazlani
1
@bilalfazlani,两者之间没有优劣之分。它们是可供您使用的工具。如果其中一个因为您使用了“async/await”方法而更适合您的应用程序,则请使用“SendMailAsync”方法。如果不是,请只需在对象上挂接回调并调用“SendAsync”方法。两者都是完全有效的。 - Mike Perrenoud
@neoistheone 最后一个问题。在这两种方法中,用于异步执行任务的线程是否会从线程池中消耗? - Bilal Fazlani
@BilalFazlani,该线程将自行启动和管理,并将从AppDomain中可用的线程池中提取。您无法自行管理该线程。 - Mike Perrenoud

11

首先,它们都以异步方式工作。

然而,SendAsync 从 .NET 2 开始就存在。为了保持向后兼容性,同时支持新的任务系统,添加了 SendMailAsync

SendMailAsync 返回一个 Task 而不是 void,如果需要,可以使用 SmtpClient 支持新的 asyncawait 功能。


1
两者都是异步工作的。我想知道其中一个相对于另一个的好处是什么? - Bilal Fazlani

2
  //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; }
        }
    }
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接