C# SmtpClient.SendAsync()未接收我发送的所有邮件

C# SmtpClient.SendAsync()未接收我发送的所有邮件,c#,smtpclient,C#,Smtpclient,我刚刚编写了一些测试代码,查看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

我刚刚编写了一些测试代码,查看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);
}

有什么想法吗?

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

  • 仅创建一个SmtpClient
  • 改为创建多条消息
  • SmtpClient实现IDisposable。用铅笔把它包起来
  • MailMessage还实现了IDisposable
我怀疑您可能遇到了多个SmtpClient实例的错误/问题,这些实例都包装了同一个SMTP服务器。使用单个实例可以解决此问题

更新

根据MSDN:

调用SendAsync后,必须等待电子邮件传输完成,然后才能尝试使用send或SendAsync发送另一封电子邮件

因此,考虑到您的情况,在Send上使用SendAsync几乎没有任何好处。您的循环可能正在踩踏某些东西,因为您没有等待上一个SendAsync完成

以下是一些想法:

  • 如果您发送大量电子邮件,SendAsync的性能几乎与Send相同。只需使用Send
  • 如果需要并行发送,请使用生产者/消费者模式。一个(或多个)生产线程将内容转储到队列中进行发送,多个消费线程使用一个SmtpClient发送消息。使用BlockingCollection实现此模式非常简单。请参见MSDN中的示例
  • 如果使用足够的线程,SMTP服务器将成为瓶颈。当您超载时,请注意

当然可以。只使用一个SmtpClient意味着在发送下一条消息之前,我需要等待每条消息被发送。此外,此测试代码大大简化了我实际遇到的一个问题,我无法回避这样一个事实:有多个SmtpClient同时访问同一台服务器。@drew:尝试让它与一个SmtpClient和多条消息一起工作,并正确处理IDisposable内容。一旦成功,让多个客户机工作。换言之,剖析问题。添加更多想法和解决方案。感谢您的想法。我的理解是,您对MSDN的报价适用于每个SMTP客户,这很公平。我认为每个smtp客户机都会使用自己的线程来执行自己的异步发送(正如您通过生产/消费建议的那样)。我很高兴使用阻塞发送,只是想了解为什么SendAsync只发送“n-1”消息?任何最终解决方案都有完整的源代码示例,有没有完整的源代码示例?
foreach (SmtpClient c in mailClients) {
    c.Send(msg);
}