gpt4 book ai didi

.net - 线程池和发送电子邮件

转载 作者:行者123 更新时间:2023-12-01 05:10:35 30 4
gpt4 key购买 nike

我们目前正在使用 ThreadPool 异步向用户发送电子邮件。本质上,我们的逻辑可以归结为:

for (int i=0 < i < numUsers; i++) 
{

//Pre email processing unrelated to sending email

string subject = GetSubject();
string message = GetMessage();
string emailAddress = GetEmailAddress();

EmailObj emailObj = new EmailObj { subject = subject, message = message, emailAddress = emailAddress };

bool sent = ThreadPool.QueueUserWorkItem(new WaitCallback(SendEmail), emailObj);

//Post email processing unrelated to sending email
}

public void SendEmail(object emailObj)
{
//Create SMTP client object
SmtpClient client = new SmtpClient(Configuration.ConfigManager.SmtpServer);

//Logic to set the subject, message etc
client.Send(mail);
}

到目前为止,该逻辑在用户数量较少的情况下运行良好。我们正试图将其扩展到能够发送一百万封左右的电子邮件。

根据 MSDN,线程池线程的最大数量基于内存并根据此 SO answer , 对于 64 位架构,线程池线程数似乎最大为 32768。

这是否意味着,只要我们一次发送的电子邮件数量 < 32768,就应该没问题?超过这个数字会发生什么?当 SMTP 服务关闭或发送电子邮件有延迟时会发生什么,线程池线程是否会等待直到电子邮件发送?

当线程数超过阈值时,标记为//与发送电子邮件无关的邮件后处理的部分是否会被执行?

非常感谢任何解释。

最佳答案

线程有开销——1MB 的线程本地存储。您永远不会希望线程池中有 32K 个线程。线程池用于门控和共享线程,因为它们有开销。如果线程池饱和, future 的调用将排队等待池中的可用线程。

另一件需要考虑的事情是 SMTP 服务器是异步的(放在出站文件夹中)。另外,正如上面有人提到的,它可能是一个瓶颈。

一种选择是通过增加发送邮件的“代理”数量来增加吞吐量,并增加 SMTP 服务器的数量以扩展解决方案。能够独立横向扩展代理和 SMTP 服务器可以解决瓶颈问题。

关于.net - 线程池和发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9675231/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com