2

SmtpClient.SendMailAsync32 個の CPU を搭載した Windows Server 2008 64 ビット Enterprise で .NET 4.5 のメソッドを使用して、大量の電子メールを送信しようとしています。

デバッグ中に、同時に実行されているリクエストは 2 つだけであることがわかりました。私がサーバーOSを使用していることを考えると、それは驚くべきことです。

簡単なテストケースを次に示します。

static void Main(string[] args)
{
    var sw = Stopwatch.StartNew();
    var t1 = SendEmail();
    var t2 = SendEmail();
    var t3 = SendEmail();
    var t4 = SendEmail();
    var t5 = SendEmail();
    var t6 = SendEmail();
    var t7 = SendEmail();
    var t8 = SendEmail();
    Task.WaitAll(t1, t2, t3, t4, t5, t6, t7, t8);
    Console.WriteLine(sw.Elapsed);
}

static async Task SendEmail()
{
    using (var smtp = new SmtpClient())
    {
        Console.WriteLine("Starting [{0}]", DateTime.UtcNow.ToString("o"));
        await smtp.SendMailAsync("...", "...", "Test", "Testing...");
        Console.WriteLine("Done [{0}]", DateTime.UtcNow.ToString("o"));
    }
}

そして結果。すぐに始まりますが、2 つのバッチで終了します (時間を参照してください)。また、Process Explorer で開いている接続を確認すると、同じ動作が示されます。

Starting [2013-03-07T14:27:17.4643296Z]
Starting [2013-03-07T14:27:17.4783382Z]
Starting [2013-03-07T14:27:17.4783382Z]
Starting [2013-03-07T14:27:17.4793387Z]
Starting [2013-03-07T14:27:17.4793387Z]
Starting [2013-03-07T14:27:17.4793387Z]
Starting [2013-03-07T14:27:17.4793387Z]
Starting [2013-03-07T14:27:17.4793387Z]
Done [2013-03-07T14:27:19.2070974Z]
Done [2013-03-07T14:27:19.2070974Z]
Done [2013-03-07T14:27:19.7541596Z]
Done [2013-03-07T14:27:19.7602234Z]
Done [2013-03-07T14:27:20.3880420Z]
Done [2013-03-07T14:27:20.3906050Z]
Done [2013-03-07T14:27:20.9254624Z]
Done [2013-03-07T14:27:20.9324577Z]
00:00:03.7476343

より多くのリクエストを実際にスピンアップする方法はありますか?

4

1 に答える 1

3

各 ServicePoint オブジェクトには、2 つの同時接続の既定の制限があります。ServicePointManager.DefaultConnectionLimit を設定することで、将来の ServicePoint インスタンス用にこれを変更できます。既存のインスタンスの ServicePoint.ConnectionLimit を変更することもできます。SmtpClient は、これを取得するために使用できる ServicePoint プロパティを公開します。

于 2013-03-07T16:00:55.647 に答える