3

У меня есть служба Windows, которая отправляет электронные письма после длительного процесса. Эта служба продолжает получать данные электронной почты из таблицы БД, всякий раз, когда есть запись в таблице и обрабатывает ее, и отправит ее.Threadpool или TPL для долгосрочных задач

В настоящее время это приложение с несколькими потоками, где мы настраиваем количество потоков до 25 на производственном сервере (который предназначен исключительно для этой цели), поскольку это предназначено для запуска 24x7x365. Но мы видим только 2 активных потока. Что может быть причиной?

Также я хочу изменить код потока с помощью пула потоков или TPL. Не могли бы вы предложить мне лучший способ справиться с этим сценарием?

Спасибо заранее!

// Пример кода ниже

Thread[] threads; 
    int ThreadCount = 25; 
    private void StartProcess() 
    { 
     //Create new threads 
     if (Threads == null) 
     { 
      // Create array of threads based on the configuration 
      threads = new Thread[ThreadCount]; 
      for (int i = 0; i < ThreadCount; i++) 
      { 
       Thread[] threads[i] = new Thread(new ThreadStart(SendEmail)); 
       threads[i].Start(); 
      } 
     } 
     else 
     { 
      resume it if exists 
      for (int j = 0; j < threads.Length; j++) 
      { 
       if (threads[j].ThreadState == Threading.ThreadState.Suspended) 
       {       
        threads[j].Resume(); 
       } 
      } 
     } 
    } 
    public void SendEmail() 
    { 
     while (Thread.CurrentThread.ThreadState == System.Threading.ThreadState.Running) 
     { 
       // send email code 
      Thread.Sleep(duration); 
     } 
    } 
+3

Вы много работаете с IO, я не вижу причин для 25 потоков вообще. Посмотрите в конечные точки базы данных SmtpClient.SendMailAsync и async. –

+2

TPL * * использует ThreadPool. Многие классы выставляют асинхронные методы как задачи, поэтому нет причин использовать необработанные потоки –

+0

Обратите внимание, что Thread.Suspend не подходит для производства. Если произойдет приостановка статического конструктора строки, ваш процесс будет запущен. Вам нужно выбросить это. – usr

ответ

0

Причина, почему вы не видите 25 темы, вероятно, что метод резьбы, SendEmail, может выйти, когда поток меняет свое состояние. Как только он выйдет, поток исчезнет и не может быть возобновлен.

Я думаю, вы можете использовать другое условие для этого цикла while.

Смежные вопросы