Я реализую платформу веб-чата в 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
}
}
}
}
Я надеюсь, что смогу объяснить ситуацию, и я также открыт для любых предложений (например, реализации другим способом)
Если вы можете помочь мне с этой проблемой Буду признателен с благодарностью, Спасибо