C# .NET以线程安全的方式异步发送多封电子邮件

C# .NET以线程安全的方式异步发送多封电子邮件,c#,multithreading,email,asynchronous,C#,Multithreading,Email,Asynchronous,我需要异步发送多封电子邮件,以避免主线程被阻塞。简单地说:我不想等待所有邮件发送的完整操作;相反,我希望通过回调接收每个邮件传递状态 为此,我使用: smtpClient.SendCompleted += new SendCompletedEventHandler(SendMailCompletedCallback); smtpClient.SendAsync( mailMessage, Guid.NewGuid ); SendMailCompletedCallback符合SendMailCo

我需要异步发送多封电子邮件,以避免主线程被阻塞。简单地说:我不想等待所有邮件发送的完整操作;相反,我希望通过回调接收每个邮件传递状态

为此,我使用:

smtpClient.SendCompleted += new SendCompletedEventHandler(SendMailCompletedCallback);
smtpClient.SendAsync( mailMessage, Guid.NewGuid );
SendMailCompletedCallback
符合SendMailCompletedCallback的事件定义:
private void SendMailCompletedCallback(对象发送方,AsyncCompletedEventArgs e)

SendAsync()方法阻止主线程,因此不会为每次电子邮件发送生成不同的线程为什么我要寻找不同的线程?因为在快速发送许多电子邮件的同时,在回调时,我在AsyncCompletedEventArgs的e.error属性上遇到了以下错误:

服务不可用,正在关闭传输通道。服务器 响应为:4.7.0临时系统问题

而且,据我所知,这是因为SMTP客户端无法处理多个电子邮件异步发送,而不会在自己的线程上重叠。 我听说一个简单的解决方案是为每个要发送的电子邮件创建一个新的SMTP客户端实例,但不幸的是,我也无法成功地做到这一点

谁能给我提供一个有效的代码?提前感谢!:)

更新: 这将是完整的代码

var mailMessage = new MailMessage { //.. };
var smtpClient = new SmtpClient { //.. };

smtpClient.SendCompleted += new SendCompletedEventHandler(SendMailCompletedCallback);
smtpClient.SendAsync( mailMessage, Guid.NewGuid );
回调如下所示:

private void SendMailCompletedCallback(object sender, AsyncCompletedEventArgs e)
{            
    if (e.Error.IsNotNull())
    {
        // here is where I get the error message mentioned above       
    }
    ((SmtpClient)sender).Dispose();
}

我认为你的想法是每个线程有一个单独的SMTP客户端是一个好主意。你能把你试过的密码贴出来吗?我们可能可以帮助你让它发挥作用。我已经从你的标题中删除了
C#
,因为它不是必需的-问题不是关于C#。虽然你的问题可能与线程安全无关,但我还是保留了线程安全的部分。这很公平。然后我添加了“.NET”,因为我使用的是.NET框架(我不希望人们认为我使用的是php、delphi等),你也不需要添加它。。。。这在新(er)用户中是一个误解-在标题中使用标签来区分问题与其他平台的诱惑或倾向,但实际上这些词是用于分类的,因此它们应该在标签中而不是标题中(对不起,长句:)如果C#标签的使用已经表明它是.Net。