1

MVC3 Web アプリケーションがあり、MvcMailer を使用して電子メールを送信しています (一度に数千の可能性があります)。これは、各受信者を同じメールに BCC するだけで問題なく動作しますが、個々のメールを送信してループしようとすると、非常に遅くなります。これは、毎回 smtp サーバーに再度接続しているためだと思いますか?

接続している独自のsmtpサーバーがあり、現在、次のようなメールを送信しようとしています:

foreach(Person x in names)
{
    var mail = Mailer.Example_Mail()
    mail.To.Add(x.Email_Address);
    mail.Send();
}

smtp サーバーに接続してすぐに送信する代わりに、メールをファイルに保存できることをチュートリアルから知っています。残念ながら方法がわかりません。

誰かがこれを行う最善の方法を教えてくれたら、それは素晴らしいことです! よろしくお願いします!

アップデート

SendAsync()@Mike が提案する方法を使用してみましたが、実際にはかなり高速化されますが、現在はメールの約 40% が失われています。エラーがスローされない場合、100 通の電子メールのうち約 65 通しか通過しません。ここの「非同期電子メールのイベントの処理」セクションで提案されているように、エラーをキャッチしようとしましたが、スローされたようには見えません。以下のコード:

List<object> errors = new List<object>();
var mail = Mailer.Example_Mail();
mail.To.Add("some@address.com");
for (int i = 0; i < 100; i++)
{
    var client = new SmtpClientWrapper();
    client.SendCompleted += (sender, e) =>
    {
        if (e.Error != null || e.Cancelled)
        {
            errors.Add(e);
        }
    };
    mail.SendAsync("user state object", client);
}
4

1 に答える 1

0

データを変更しておらず、マシンに十分な量の処理能力 (複数のコアなど) がある場合は、Parallel foreach ループの使用を試みることができます。

http://msdn.microsoft.com/en-us/library/dd460720.aspx

これは本質的に、繰り返しの各アイテムに対して複数のスレッドを生成します。ただし、アプローチには注意してください: http://msdn.microsoft.com/en-us/library/dd997392.aspx

基本的に、いくつかのテストを行います->これはうまく機能し、プロセスを高速化する場合もあれば、そうでない場合もあります。実際には、セットアップとコード構成に依存します。

于 2012-08-02T04:33:11.637 に答える