SmtpClient可伸缩性问题(只有两个正在运行的请求)

本文关键字:两个 运行 请求 问题 可伸缩性 SmtpClient | 更新日期: 2023-09-27 18:02:51

我正试图在Windows Server 2008 64位Enterprise上使用.NET 4.5中的SmtpClient.SendMailAsync方法发送一堆电子邮件。

在调试过程中,我发现只有两个请求同时运行。考虑到我使用的是服务器操作系统,这是值得的。

这里有一个简单的测试用例:

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"));
    }
}

以及结果。它开始得很快,但以两个一批的方式结束(见时间(。在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

有没有一种方法真的可以引发更多的请求?

SmtpClient可伸缩性问题(只有两个正在运行的请求)

每个ServicePoint对象默认限制为2个并发连接。您可以通过设置ServicePointManager.DefaultConnectionLimit为将来的ServicePoint实例修改此属性。您也可以为现有实例修改ServicePoint.ConnectionLimit-SmtpClient公开一个ServicePoint属性,您可以使用该属性来获取此属性。