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