既然SmtpClient是一次性的,我对如何管理它感到有点困惑,特别是当我使用SendAsync进行调用时。大概在SendAsync完成之前,我不应该调用Dispose。但我是否应该调用它(例如,使用" using ")。这个场景是一个WCF服务,它在调用时定期发送电子邮件。大部分计算都很快,但发送电子邮件可能需要一秒钟左右,因此异步会更好。
我应该在每次发送邮件时创建一个新的SmtpClient吗?我应该为整个WCF创建一个吗?帮助!
更新以防有所不同,每封电子邮件都是为用户定制的。WCF托管在Azure上,Gmail用作邮件程序。
发布于 2011-09-02 05:32:41
注意:.NET 4.5 SmtpClient实现了async awaitable
方法SendMailAsync
。对于较低版本,请使用SendAsync
,如下所述。
您应该始终尽可能早地处理IDisposable
实例。在异步调用的情况下,这在消息发送后的回调上。
var message = new MailMessage("from", "to", "subject", "body"))
var client = new SmtpClient("host");
client.SendCompleted += (s, e) => {
client.Dispose();
message.Dispose();
};
client.SendAsync(message, null);
SendAsync
不接受回调有点恼人。
发布于 2014-03-18 14:06:51
最初的问题是针对.NET 4提出的,但如果从.NET 4.5开始,SmtpClient实现了异步可等待方法SendMailAsync
,则会有所帮助。
因此,异步发送电子邮件的步骤如下:
public async Task SendEmail(string toEmailAddress, string emailSubject, string emailMessage)
{
using (var message = new MailMessage())
{
message.To.Add(toEmailAddress);
message.Subject = emailSubject;
message.Body = emailMessage;
using (var smtpClient = new SmtpClient())
{
await smtpClient.SendMailAsync(message);
}
}
}
最好避免使用SendAsync方法。
发布于 2011-09-02 05:29:44
通常,应该尽快释放IDisposable对象;在对象上实现IDisposable旨在传达这样一个事实,即相关类持有昂贵的资源,应该确定地释放这些资源。但是,如果创建这些资源的成本很高,并且您需要构造大量这样的对象,那么在内存中保留一个实例并重用它可能会更好(在性能方面)。只有一种方法可以知道这是否有什么不同:分析它!
Re: disposing和Async:显然不能使用using
。相反,通常在SendCompleted事件中释放对象:
var smtpClient = new SmtpClient();
smtpClient.SendCompleted += (s, e) => smtpClient.Dispose();
smtpClient.SendAsync(...);
https://stackoverflow.com/questions/7276375
复制相似问题