【发布时间】:2014-03-20 20:47:36
【问题描述】:
代码:-
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>());
ERROR-“发送邮件失败。”
内部错误-“无法从传输连接中读取数据:net_io_connectionclosed。”
【问题讨论】:
-
可能是您打开了太多与 SMTP 服务器的连接,或者访问速度太快而导致您受到限制?如果您每秒执行一次……或每五秒执行一次会发生什么?
-
我认为
SmtpClient(或服务器)不支持同时连接到同一个服务器的多个连接。想想你要求它做什么:你要求多个SmtpClient对象连接到 same 服务器并发送电子邮件。SmtpClient将重复使用与同一服务器的连接,因此您可能处于竞争状态。您是否尝试过使用SendAsync而不是Task? -
至少,我希望您希望使用一个
SmtpClient对象 -
上周我有同样的项目要做。我一到电脑就会发布一些代码。 P.S 使用并行 for 循环而不是创建多个任务。
标签: .net task-parallel-library c#-5.0