.NET异步发送多封电子邮件并保证线程安全

时间:2015-06-22 00:30:10

标签: c# multithreading email asynchronous

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

为此,我使用:

smtpClient.SendCompleted += new SendCompletedEventHandler(SendMailCompletedCallback);
smtpClient.SendAsync( mailMessage, Guid.NewGuid );

虽然SendMailCompletedCallback符合SendCompleted事件定义:private void SendMailCompletedCallback(object sender, AsyncCompletedEventArgs e)

现在,虽然SendAsync()方法会阻止主线程,但它不会为每个发送的电子邮件生成不同的线程。 为什么我要寻找不同的线程?因为在快速发送许多电子邮件时,在回调中我在 e.Error 属性上收到此错误 AsyncCompletedEventArgs

  

服务不可用,关闭传输通道。服务器   回应是: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();
}

0 个答案:

没有答案