gpt4 book ai didi

c# - SmtpClient - 什么是正确的生命周期?

转载 作者:太空狗 更新时间:2023-10-29 20:09:49 29 4
gpt4 key购买 nike

我正在创建每 5 分钟发送一批电子邮件的 Windows 服务。

我想每 5 分钟发送 10-100 封电子邮件。这是极端情况。每 5 分钟发送一次批处理,通常最多包含 10 封电子邮件。

我正在使用 System.Net.Mail 命名空间中的 SmtpClient。

SmtpClient 对象的正确生命周期是多少?我应该在每次发送批处理时创建一个吗?或者我应该在服务启动时创建一个并且永远不要处理它吗?

最佳答案

您应该始终使用using

using (var smtpClient = new SmtpClient())
{
smtpClient.SendMail(message);
}

在大多数情况下,您应该始终在完成后立即处理任何实现 IDisposable 的东西,但是您应该始终检查文档以确保。 .NET 4.0 中的 SmtpClient 类实现了 IDisposable 所以一定要使用它!

引用MSDN:

The SmtpClient class has no Finalize method, so an application mustcall Dispose to explicitly free up resources.

如果您发现自己在执行与异步相关的任务,那么您可以为每封电子邮件创建一个新实例以防止自己阻塞。您可以使用以下方法。

var smtpClient = new SmtpClient();
smtpClient.SendCompleted += (s, e) => {
client.Dispose();
message.Dispose();
};
client.SendAsync(message, null);

应要求 - 批量发送电子邮件的最佳选择

如上所述,您可以重复使用同一个客户端。如果你把它们都放在同一个线程上,我建议你只使用一个客户端

MSDN 状态:

The SmtpClient class implementation pools SMTP connections so that itcan avoid the overhead of re-establishing a connection for everymessage to the same server. An application may re-use the sameSmtpClient object to send many different emails to the same SMTPserver and to many different SMTP servers.

然而它接着说:

...As a result, there is no way to determine when an application isfinished using the SmtpClient object and it should be cleaned up.

因此假设您在完成后处置您的 Client 就可以了。


下面链接了一些与 SMTP 相关的主题的讨论,因为我最近发现自己在问同样的问题

更多来自 Stackoverflow:

What are best practices for using SmtpClient, SendAsync and Dispose under .NET 4.0

How to dispose objects having asynchronous methods called?

相关阅读:

MSDN SmtpClient

Implementing Finalize and Dispose to clean up managed resources

关于c# - SmtpClient - 什么是正确的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30591046/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com