Использование процессора увеличивается до 100% в бесконечном цикле в потоке

Я реализую платформу веб-чата в ASP.NET, и я использую технику, аналогичную длительному опросу. Я имею в виду, что я сохраняю каждый веб-запрос от клиента в течение определенного периода времени (тайм-аут) или до тех пор, пока не придет новое сообщение, а затем ответ будет отправлен клиенту.

Я сохраняю подключенных клиентов в памяти (объект словаря), и когда когда-либо новое сообщение отправляется клиенту, я записываю это сообщение в массив сообщений клиента-получателя. Клиенту необходимо отправить запрос на получение собственных сообщений, и я храню этот запрос в массиве в памяти.

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

Я не использую потоки пула потоков .net для проверки наличия новых сообщений или веб-запросов с истекшим временем ожидания. Я создаю такие потоки:

System.Threading.Thread t = new Thread(new ThreadStart(QueueCometWaitRequest_WaitCallback));
t.IsBackground = false;
t.Start();

В каждом методе QueueCometWaitRequest_WaitCallback каждого потока я нахожусь в бесконечном цикле while:

while (true)
{
...
Thread.Sleep(100);
}

В этом я проверяю тайм-аут веб-запроса или новое сообщение для каждого веб-запроса, который также хранится в массиве в памяти.

Все работало нормально, пока я не заметил, что загрузка ЦП достигает 100% по времени. (через несколько минут после первого подключенного клиента) В начале первого запроса все вроде нормально, я имею в виду, что загрузка ЦП не превышает 10% при возврате ответа клиенту. Но со временем даже с двумя клиентами загрузка ЦП увеличивается до 100%. Кажется, что загрузка ЦП составляет 100% только при записи в ответ на запрос клиента.Если клиентов не осталось, все возвращается в нормальное состояние (загрузка ЦП составляет около 0%) до тех пор, пока клиент не выполнит новый веб-запрос.

Я не знаю подробно эти потоки, но я с подозрением отношусь к новым потокам, которые я создал и которые работают бесконечно. Это похоже на то, что операционная система со временем дает им больше использования ЦП и ресурсов, поскольку они работают все время, а этот Thread.Sleep (100) не работает.

Вот метод QueueCometWaitRequest_WaitCallback ():

void QueueCometWaitRequest_WaitCallback()
{
   while (true)
   {
      if (processRequest.Length == 0)
      {
          Thread.Sleep(100);
      }
      else
      {
          for (int i = 0; i < processRequest.Length; i++)
          {
               Thread.Sleep(100);

               // below I am checking for new message or request time out 
               .................
               .................

               // If new message or time out I write to response
          }
      }    
   }
}

Я надеюсь, что смогу объяснить ситуацию, и я также открыт для любых предложений (например, реализации другим способом)

Если вы можете помочь мне с этой проблемой Буду признателен с благодарностью, Спасибо

7
задан sll 16 January 2012 в 14:37
поделиться