代码: -
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。”
答案 0 :(得分:2)
关于“net_io_connectionclosed”异常,请查看此链接,因为它可能会指出您正确关闭连接的原因。它可能是身份验证问题,防火墙等。
Enabling Tracing for System.Net
请在下面找到我将在您的情况下使用的代码,而不是产生1000个效率不高的任务。
答案 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);
我不确定这是否真的会有所帮助,但如果它仍然失败,你可能只需要制作一个长时间运行的任务来连续发送电子邮件。