首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在.NET 4.0下使用SmtpClient、SendAsync和Dispose的最佳实践是什么

在.NET 4.0下使用SmtpClient、SendAsync和Dispose的最佳实践是什么
EN

Stack Overflow用户
提问于 2011-09-02 04:51:09
回答 6查看 89.2K关注 0票数 123

既然SmtpClient是一次性的,我对如何管理它感到有点困惑,特别是当我使用SendAsync进行调用时。大概在SendAsync完成之前,我不应该调用Dispose。但我是否应该调用它(例如,使用" using ")。这个场景是一个WCF服务,它在调用时定期发送电子邮件。大部分计算都很快,但发送电子邮件可能需要一秒钟左右,因此异步会更好。

我应该在每次发送邮件时创建一个新的SmtpClient吗?我应该为整个WCF创建一个吗?帮助!

更新以防有所不同,每封电子邮件都是为用户定制的。WCF托管在Azure上,Gmail用作邮件程序。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-02 05:32:41

注意:.NET 4.5 SmtpClient实现了async awaitable方法SendMailAsync。对于较低版本,请使用SendAsync,如下所述。

您应该始终尽可能早地处理IDisposable实例。在异步调用的情况下,这在消息发送后的回调上。

代码语言:javascript
运行
复制
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不接受回调有点恼人。

票数 148
EN

Stack Overflow用户

发布于 2014-03-18 14:06:51

最初的问题是针对.NET 4提出的,但如果从.NET 4.5开始,SmtpClient实现了异步可等待方法SendMailAsync,则会有所帮助。

因此,异步发送电子邮件的步骤如下:

代码语言:javascript
运行
复制
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方法。

票数 178
EN

Stack Overflow用户

发布于 2011-09-02 05:29:44

通常,应该尽快释放IDisposable对象;在对象上实现IDisposable旨在传达这样一个事实,即相关类持有昂贵的资源,应该确定地释放这些资源。但是,如果创建这些资源的成本很高,并且您需要构造大量这样的对象,那么在内存中保留一个实例并重用它可能会更好(在性能方面)。只有一种方法可以知道这是否有什么不同:分析它!

Re: disposing和Async:显然不能使用using。相反,通常在SendCompleted事件中释放对象:

代码语言:javascript
运行
复制
var smtpClient = new SmtpClient();
smtpClient.SendCompleted += (s, e) => smtpClient.Dispose();
smtpClient.SendAsync(...);
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7276375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档