gpt4 book ai didi

c# - SmtpClient.SendAsync() 没有收到我发送的所有消息

转载 作者:行者123 更新时间:2023-11-30 12:12:49 30 4
gpt4 key购买 nike

我刚刚编写了一些测试代码来查看 System.Net.Mail.SmtpClient 向我自己发送相同的消息。

int numClients = 10;
List<SmtpClient> mailClients = new List<SmtpClient>();
for (int i = 0; i < numClients; i++) {
mailClients.Add(new SmtpClient(smtpHost));
}

MailMessage msg = new MailMessage("myAddress@eg.com", "myAddress@eg.com", "test message", "" );
foreach (SmtpClient c in mailClients) {
c.SendAsync(msg, null);
}

除了我只收到 'n - 1' 条消息外,这一切都很好并且执行没有任何问题。也就是说,如果我发送 10 条消息,我的收件箱中只会收到 9 条。如果我发送 50,我只会收到 49,等等。

注意:如果我更改代码以使用阻塞发送,那么我将始终收到正确数量的消息。例如

foreach (SmtpClient c in mailClients) {
c.Send(msg);
}

有什么想法吗?

最佳答案

以下是一些可能有帮助的观察结果:

  • 只创建一个 SmtpClient。
  • 改为创建多条消息。
  • SmtpClient 实现 IDisposable。用 using 包裹它。
  • MailMessage 还实现了 IDisposable。

我怀疑您可能遇到了多个 SmtpClient 实例的错误/问题,这些实例都包装了同一个 SMTP 服务器。使用单个实例可能会解决问题。

更新

根据 MSDN:

After calling SendAsync, you must wait for the e-mail transmission to complete before attempting to send another e-mail message using Send or SendAsync.

http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx

因此鉴于您的情况,使用 SendAsync 而不是 Send 几乎没有任何好处。您的循环可能正在踩踏某些东西,因为您没有等待之前的 SendAsync 完成。

这里有一些想法:

  • 如果您要发送一堆电子邮件,SendAsync 的性能几乎与 Send 相同。只需使用发送。
  • 如果您需要并行发送,请使用生产者/消费者模式。一个(或多个)生产线程将内容转储到队列中进行发送,多个消费线程各自使用一个 SmtpClient 发送消息。使用 BlockingCollection 实现此模式非常简单。请参阅 MSDN 中的示例 http://msdn.microsoft.com/en-us/library/dd267312.aspx
  • 如果您使用足够多的线程,您的 SMTP 服务器将成为瓶颈。请注意何时重载。

关于c# - SmtpClient.SendAsync() 没有收到我发送的所有消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12808452/

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