C# RateDirectory和它有效地释放了邮件发送代码来发送许多电子邮件

C# RateDirectory和它有效地释放了邮件发送代码来发送许多电子邮件,c#,mailkit,C#,Mailkit,因此,为了证实,并行循环工作得很好,其他地方潜在的性能问题才是真正的瓶颈。因此,我们找到了一个范围更广的解决方案,除了Parralel ForEach循环的改进外,还大大提高了性能。与MailKit无关,但我想我还是会分享的。调用代码创建inputList的方式是使用DirectoryInfo.GetDirectory枚举目录中的所有第一个。在某些情况下,我们的代码在包含40k文件的目录上执行需要2秒钟。我们将其更改为EnumerateDirectory,有效地释放了邮件发送代码以发送许多电子邮

因此,为了证实,并行循环工作得很好,其他地方潜在的性能问题才是真正的瓶颈。

因此,我们找到了一个范围更广的解决方案,除了Parralel ForEach循环的改进外,还大大提高了性能。与MailKit无关,但我想我还是会分享的。调用代码创建inputList的方式是使用DirectoryInfo.GetDirectory枚举目录中的所有第一个。在某些情况下,我们的代码在包含40k文件的目录上执行需要2秒钟。我们将其更改为EnumerateDirectory,有效地释放了邮件发送代码以发送许多电子邮件



因此,为了证实,并行循环工作得很好,其他地方的潜在性能问题才是真正的瓶颈。

您能用代码示例更新您的问题吗:
Parallel foreach
始终将代码编辑到问题中,而不是注释中。那你就不必为此道歉了是的,谢谢。希望这样更好。首先,我假设您的任务主要是等待io完成,因此您可以增加并行性。第二,你不是需要一个客户来完成每项任务吗?您真的可以使用同一个客户端同时发送多条消息吗?我假设client.send会锁定套接字,因此请忽略| | foreach,因为您一次只发送一条消息……您好,正如在评论中提到的那样,我们已尝试增加并行性,但没有多大区别。试过10、50和-1(我相信是无限的)。如果不写更多的代码,我不知道如何解决这个问题。是的,使用相同的客户机是可行的,但我们也尝试了通过将其放置在循环中为每条消息创建客户机。仍然可以工作,但会使它稍微慢一点。显然,发送电子邮件永远不会很快,这就是为什么我们需要在同一时间发送尽可能多的电子邮件。您能否使用代码示例更新您的问题:
parallel foreach
始终将代码编辑到问题中,而不是注释中。那你就不必为此道歉了是的,谢谢。希望这样更好。首先,我假设您的任务主要是等待io完成,因此您可以增加并行性。第二,你不是需要一个客户来完成每项任务吗?您真的可以使用同一个客户端同时发送多条消息吗?我假设client.send会锁定套接字,因此请忽略| | foreach,因为您一次只发送一条消息……您好,正如在评论中提到的那样,我们已尝试增加并行性,但没有多大区别。试过10、50和-1(我相信是无限的)。如果不写更多的代码,我不知道如何解决这个问题。是的,使用相同的客户机是可行的,但我们也尝试了通过将其放置在循环中为每条消息创建客户机。仍然可以工作,但会使它稍微慢一点。显然,发送电子邮件永远不会很快,这就是为什么我们需要在同一时间发送尽可能多的电子邮件。感谢您的回复。这是值得赞赏的。不幸的是,我的情况略有不同,我正在有效地转发电子邮件,所以不能这样做。没问题。很高兴你找到了答案(我刚刚读了你的解决方案),谢谢分享。这对服务器端有什么帮助?服务器上的smtp客户端仍需要分别连接到每个地址的每个邮件服务器…?是的,服务器需要连接到每个邮件服务器才能发送到每个地址。感谢您的响应。这是值得赞赏的。不幸的是,我的情况略有不同,我正在有效地转发电子邮件,所以不能这样做。没问题。很高兴你找到了答案(我刚刚读了你的解决方案),谢谢分享。这对服务器端有什么帮助?服务器上的smtp客户端仍然需要分别连接到每个地址的每个邮件服务器…?是的,服务器需要连接到每个邮件服务器才能发送到每个地址。
            var rangePartitioner = Partitioner.Create(0, inpList.Count, 15);

            var po = new ParallelOptions { MaxDegreeOfParallelism = 30 };


            Parallel.ForEach(rangePartitioner, (range, loopState) =>
            {
                using (var client = new SmtpClient(new SlabProtocolLogger()))
                {

                    client.Connect(_appSettings.RelayAddress, _appSettings.RelayPort);
                    client.AuthenticationMechanisms.Remove("XOAUTH2");

                    for (int i = range.Item1; i < range.Item2; i++)
                    {

                        var message = _outboundQueueRepository.Read(inpList[i]).Load();
                        client.Send(message.Body, message.Metadata.Sender, message.Metadata.Recipients.Select(r => (MailboxAddress)r));

                        _outboundQueueRepository.Remove(inpList[i]);
                    };
                }

            });
From: no-reply@company.com
To: Joe The Plumber <joe@plumbing-masters.com>
Subject: We've got a new sale! 50% off everything in stock!

some message text goes here.
From: no-reply@company.com
To: Sara the Chef <sara@amazing-chefs.com>
Subject: We've got a new sale! 50% off everything in stock!

some message text goes here.
From: no-reply@company.com
To: Ben the Cobbler <ben@cobblers-r-us.com>
Subject: We've got a new sale! 50% off everything in stock!

some message text goes here.
From: no-reply@company.com
To: undisclosed-recipients:;
Subject: We've got a new sale! 50% off everything in stock!

some message text goes here.
var sender = new MailboxAddress (null, "no-reply@company.com");
var recipients = new List<MailboxAddress> ();
recipients.Add (new MailboxAddress ("Joe the Plumber", "joe@plumbing-masters.com"));
recipients.Add (new MailboxAddress ("Sara the Chef", "sara@amazing-chefs.com"));
recipients.Add (new MailboxAddress ("Ben the Cobbler", "ben@cobblers-r-us.com"));

client.Send (message, sender, recipients);