【问题标题】:asp.net ThreadPool - long running operationasp.net ThreadPool - 长时间运行的操作
【发布时间】:2011-01-10 01:55:37
【问题描述】:

我的应用程序是在 iis 6 (windows 2003) 上运行的 asp.net 3.5 此应用程序每天为 1000 名用户提供服务(100-500 名在线用户)。

我想每周向客户发送一封电子邮件简报。

每次大约 200,000 封电子邮件。

这是我正在使用的代码:

 ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncProcessMailerQueue), null);

 private static void AsyncProcessMailerQueue(object data)
 {
    for (int i=0;i<users.count ; i++)
    {
      MailMessage message = new MailMessage();
      .......
      SmtpClient smtpClient = new SmtpClient();
      smtpClient.Send(message);
    }
 }

在本地(在我的开发机器上)测试时,我发现应用程序运行速度慢了很多。

  1. 有没有更好的方法来编写这段代码?
  2. 我应该使用 ThreadPool.QueueUserWorkItem 还是使用 Thread t = new Thread(new ThreadStart(DoWork)) 创建一个新线程; ?
  3. 最好创建一个完全独立的应用程序来发送新闻通讯。如果在同一台机器上运行此应用程序会有所帮助吗?

我在这里看到其他帖子谈论 ThreadPool 与 Thread,但似乎没有人确定哪个更好。

【问题讨论】:

    标签: asp.net multithreading threadpool


    【解决方案1】:

    是的,我认为您应该将其移出您的网络应用程序,因为您正在从线程池中占用处理您的请求所需的线程(听起来您获得了大量流量)。

    您还同步发送电子邮件,这意味着线程的使用时间比它需要的时间长得多 - 如果您继续使用这种 ThreadPool 方法,我建议将它们排队到 IIS SMTP 服务(查看 System.Net .Mail.SmtpClient.DeliveryMethod),它只是将文件写入队列文件夹,由 IIS SMTP 服务监控。

    但实际上您应该考虑将其移至 Windows 服务。

    【讨论】:

    • 谢谢! ,这听起来是个好建议!我猜这不是 SmtpClient 的默认行为?
    • 没问题。不,这不是默认行为,要做到这一点,您需要设置 mySmtpClientInstance.DeliveryMethod = DeliveryMethod .PickupDirectoryFromIis 并确保 IIS SMTP 服务正在运行。祝你好运..
    【解决方案2】:

    离开 asp.net 将是一个不错的选择。这可能是您从命令提示符运行的简单命令行应用程序。为什么需要服务或将其作为 URL 托管?

    【讨论】:

    • 我不需要将它作为 url 托管,但它更简单,因为我已经拥有这个 asp.net 项目中的所有功能/数据访问代码。
    • @sharru,您可以将项目分成不同的部分,所有功能访问和数据内容都可以分成一个共享项目。无论如何,这是一个很好的设计,即使您没有运行这个单独的进程。
    • 这有点晚了 :) 这是一个大项目。我可以精确相关代码并使用它,或者我可以在服务中使用 asp.net dll,不是吗?
    • 您可以考虑使用 ashx 文件来获取大量您不想从流程中删除的垃圾。您已经在 IIS 内部,并且已经将工作转移到另一个线程。如果您的服务器上有负载,可能需要放置一些东西来防止 2 个或更多同时运行。
    • - 不退款不退货,不太明白你的评论,ashx 处理程序会做什么?
    【解决方案3】:

    按优先顺序:

    1. 创建另一个应用程序。 Windows 服务将是一个不错的选择
    2. 使用Thread t = new Thread(new ThreadStart(DoWork));
    3. 您当前的实现

    【讨论】:

    • 谢谢! ,如果我创建一个 Windows 服务,我也应该在其中使用线程吗?如果我继续使用 asp.net,为什么新线程比使用 ThreadPool 更好?
    • 是的,推荐使用线程。如果您继续使用 ASP.NET,则将 ThreadPool 用于长时间运行的任务是一个坏主意,因为这些线程用于处理请求,如果您有许多线程被阻止执行此类操作,则站点可能会停止工作。
    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多