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個のタスクを生成する代わりに、私があなたの状況で使用するコードを以下に見つけてください。

TasksParallel.ForEachを使用して一括メールを送信する

于 2013-03-27T19:40:13.333 に答える
0

ジムが述べているように、あなたはおそらくスロットル/拒否の状況にぶつかっているだけです。IMHO、1)N個ではなく単一のSmtpClientを使用して(したがって、単一のクライアントが必要に応じて内部でシリアル化できるように)、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);

それが本当に大いに役立つかどうかはわかりませんが、それでも失敗する場合は、メールを連続して送信する1つの長時間実行タスクを作成する必要があるかもしれません。

于 2013-03-27T15:57:15.080 に答える