2

代码:-

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>());

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

内部错误-“无法从传输连接读取数据:net_io_connectionclosed。”

4

2 回答 2

2

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

为 System.Net 启用跟踪

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

使用 Tasks Parallel.ForEach 发送批量电子邮件

于 2013-03-27T19:40:13.333 回答
0

正如吉姆所提到的,您可能只是遇到了节流/拒绝的情况。恕我直言,您可能会更成功:1)使用单个 SmtpClient 而不是其中的 N 个(因此单个客户端可以根据需要在内部进行序列化)和 2)使用内置异步调用(SendMailAsync)而不是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);

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

于 2013-03-27T15:57:15.080 回答