这两种方法有啥区别?
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
支持新的async
和await
功能(如果需要)。
【讨论】:
两者都在异步工作。我想知道一个比另一个有什么好处?【参考方案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】:SendMailAsync
SendAsync
的简单 TAP 包装器
更多信息:Are the SmtpClient.SendMailAsync methods Thread Safe?
【讨论】:
以上是关于这两种方法有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
K均值聚类法和系统聚类法有啥区别,这两种聚类方法的适用条件都是啥?