繁体   English   中英

为什么发送许多电子邮件异步阻止站点? (使用Action.BeginInvoke)

[英]Why does sending many emails asynchronously block the site? ( using Action.BeginInvoke )

我创建了一个页面,向我们的客户发送成千上万的电子邮件,几乎是8K电子邮件。 发送过程需要花费数小时,但是过了一会儿,除了静态文件(图像等)之外,我无法访问托管该页面的站点中的任何页面(等待...)。

使用:IIS 6和.Net 4.0

码:

public static bool Send(MailSettings settings, Action<string, string[], bool> Sent = null)
{
  System.Net.Mail.SmtpClient client; 
...
  foreach(){
    try{ client.Send(message);}catch{...client.Dispose();...}
    Sent.BeginInvoke(stringValue, stringArray, boolValue, null, null);
    if(count++>N){
       count=1;
       System.Threading.Thread.Sleep(1000);
    }
  }
...
}

public void SentComplete(string email, string[] value, bool isSent)
{
   ....//DB logging
}
  • 注意:使用相同应用程序池的其他站点也可以!

问题:

  • IIS 6.0对同一网站的线程数是否有限制?

  • 如果我的代码引起任何性能问题,您有任何想法吗? 我使用Action是否正确?

此代码有很多错误:

  1. 您的尝试捕获块很奇怪。 您正在一次迭代中放置一个对象,但其他对象也可以使用它。 尝试改为使用块。
  2. asp.net请求有一个最大的执行时间。
  3. 不要将线程睡眠放在asp.net中!
  4. 是的,asp.net池中有最大线程数

如果最终由于某种原因而被阻止,您也可能被会话阻止(如果您有一个会话)...如果您打开其他浏览器,是否可以正常工作?

您正在触发一大堆要在线程池中执行的动作。 线程池将创建一个最大数量的线程,之后,发送到该池的工作项只会排队。 由于您要用大量的操作来充斥线程池,因此您就无法避免线程池有机会来处理由ASP.NET添加的用于处理页面的项目。 由于静态项目不需要将工作推送到线程池,因此可以为这些项目提供服务。

您不应该并行发射那么多项目。 您应该将并行度限制在一个相当小的固定值上。 让您启动的少数几个项目处理大量的操作,以便线程池中的线程也可以进行其他操作。

我们定期发送10000个客户电子邮件。 我将电子邮件的所有详细信息存储在数据库中,然后调用Web服务发送它们。 这只是对它们的挑战,对其他都没有影响。 在每次发送Send的调用之间,我确实使线程处于睡眠状态(在Web服务中),持续了100毫秒。如果不执行此操作,则会触发大量电子邮件,似乎使我们的邮件服务器不知所措,并且发生了一些奇怪的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM