使用任务并行库发送邮件会引发错误

时间:2013-03-27 13:01:35

标签: .net task-parallel-library c#-5.0

代码: -

List<Task> tasks = new List<Task>();
foreach (var item in arr)//arr contains 1000+ mailids
            {
                tasks.Add(Task.Factory.StartNew(() =>
                {
                    using (MailMessage msg = new MailMessage())
                        {
                            msg=getmsg();//p-shadow code no erorr here
                            SmtpClient smtp = new SmtpClient();
                            smtp.Host = smtpServer;
                            smtp.Port = smtpPort;
                            smtp.EnableSsl = isSmtpSsl != 0 ? true : false;
                            smtp.Credentials = new NetworkCredential(smtpUName,smtpPass);
                            smtp.Timeout = int.MaxValue;
                            smtp.Send(msg);//---throws error....
                            //sql code to insert db that mail is send
                        }
                }, TaskCreationOptions.LongRunning));
            }
            Task.WaitAll(tasks.ToArray<Task>());

错误 - “发送邮件失败。”

INTERNAL ERROR-“无法从传输连接中读取数据:net_io_connectionclosed。”

2 个答案:

答案 0 :(得分:2)

关于“net_io_connectionclosed”异常,请查看此链接,因为它可能会指出您正确关闭连接的原因。它可能是身份验证问题,防火墙等。

Enabling Tracing for System.Net

请在下面找到我将在您的情况下使用的代码,而不是产生1000个效率不高的任务。

Sending bulk emails with Tasks Parallel.ForEach

答案 1 :(得分:0)

正如吉姆提到的那样,你可能只是遇到了限制/拒绝的情况。恕我直言,你可能会更成功1)使用单个SmtpClient而不是N个(因此单个客户端可以在内部序列化/如果需要)和2)使用内置的异步调用({{3} })而不是StartNew并调用同步版本。

类似的东西:

var messages = ... // get collection of MailMessage instances
var smtpClient = new SmtpClient { ... }; // construct a single SmtpClient
var tasks = messages.Select(smtpClient.SendMailAsync).ToArray();
Task.WaitAll(tasks);

我不确定这是否真的会有所帮助,但如果它仍然失败,你可能只需要制作一个长时间运行的任务来连续发送电子邮件。