asp.net ThreadPool - длительная операция - PullRequest
5 голосов
/ 27 января 2010

Мое приложение - asp.net 3.5, работающее на iis 6 (windows 2003) Это приложение обслуживает тысячи пользователей ежедневно (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, но, похоже, никто не уверен, что лучше.

Ответы [ 3 ]

3 голосов
/ 27 января 2010

В порядке предпочтения:

  1. Создайте другое приложение. Служба Windows будет хорошим выбором
  2. Использование Thread t = new Thread(new ThreadStart(DoWork));
  3. Ваша текущая реализация
2 голосов
/ 27 января 2010

Выход из asp.net будет хорошим выбором. Это может быть простое приложение командной строки, которое вы запускаете из командной строки. Зачем вам нужен сервис или он должен быть размещен как URL?

1 голос
/ 27 января 2010

Да, я думаю, вы должны удалить это из своего веб-приложения, так как вы берете потоки из пула потоков, которые необходимы для обслуживания ваших запросов (похоже, вы получаете достаточно трафика).

Вы также отправляете электронные письма синхронно, что означает, что поток используется гораздо дольше, чем нужно - если вы продолжите использовать этот подход ThreadPool, я бы предложил поставить их в очередь в службу IIS SMTP (см. System.Net .Mail.SmtpClient.DeliveryMethod), который просто записывает файл в папку очереди, которая отслеживается службой SMTP IIS.

Но на самом деле вам стоит подумать о переносе этого в службу Windows.

...