asp.net ThreadPool - 长时间运行的操作

时间:2010-01-27 17:38:40

标签: asp.net multithreading threadpool

我的应用程序是在iis 6上运行的asp.net 3.5(Windows 2003) 该应用程序每天为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 (新的ThreadStart(DoWork))创建一个新线程; ?
  3. 为发送简报而创建一个完全独立的应用程序会更好吗?如果在同一台机器上运行此应用程序,会有帮助吗?
  4. 我在这里看过其他帖子谈论ThreadPool vs Thread,但似乎没有人确定哪个更好。

3 个答案:

答案 0 :(得分:3)

按优先顺序排列:

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

但实际上你应该考虑将其转移到Windows服务。