У меня есть служба 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);
}
}
Вы много работаете с IO, я не вижу причин для 25 потоков вообще. Посмотрите в конечные точки базы данных SmtpClient.SendMailAsync и async. –
TPL * * использует ThreadPool. Многие классы выставляют асинхронные методы как задачи, поэтому нет причин использовать необработанные потоки –
Обратите внимание, что Thread.Suspend не подходит для производства. Если произойдет приостановка статического конструктора строки, ваш процесс будет запущен. Вам нужно выбросить это. – usr