Подтвердить что ты не робот

В чем разница между этими двумя методами?

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 для обоих методов, очень неоднозначно (по крайней мере, для меня это так.)

4b9b3361

Ответ 1

Разница заключается в одном SendMailAsync использует новую технологию async/await, а другая использует старую технологию обратного вызова. И что еще более важно, переданный Object просто передается в обработчик событий как userState, когда метод завершается.

Ответ 2

Во-первых, они оба работают асинхронно.

Однако SendAsync существует с .NET 2. Чтобы поддерживать обратную совместимость, поддерживая новую систему Tasks SendMailAsync.

SendMailAsync возвращает Task, а не void и позволяет SmtpClient поддерживать новые функции async и await, если это необходимо.

Ответ 4

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