Estoy implementando una plataforma de chat basada en la web en la aplicación web ASP.NET, y uso una técnica similar a la del sondeo largo. Quiero decir, mantengo cada solicitud web del cliente durante un período de tiempo específico (tiempo de espera) o hasta que llega un mensaje nuevo, y luego se envía una respuesta al cliente.uso de la CPU aumentando hasta 100% en bucle infinito en el hilo
Mantengo clientes conectados en la memoria (objeto de diccionario) y cada vez que se envía un mensaje nuevo a un cliente, escribo este mensaje en la matriz de mensajes del cliente receptor. El cliente necesita enviar una solicitud para obtener sus propios mensajes, y guardo esta solicitud en una matriz en la memoria.
Estoy usando el manejador http asincrónico para la solicitud del cliente de escuchas, estoy manteniendo las solicitudes web en una matriz en la memoria. Utilizo hilos para verificar continuamente nuevos mensajes de la memoria (en el diccionario que se crea para cada cliente).
No consumo .net hilos grupo de subprocesos para comprobar si hay nuevos mensajes o con tiempo excedido requests.I web crear hilos de la siguiente manera:
System.Threading.Thread t = new Thread(new ThreadStart(QueueCometWaitRequest_WaitCallback));
t.IsBackground = false;
t.Start();
En el método QueueCometWaitRequest_WaitCallback de cada hilo estoy en un bucle while:
while (true)
{
...
Thread.Sleep(100);
}
en este método, yo soy el registro de tiempo de solicitud web a cabo o un nuevo mensaje para cada solicitud web que también se mantiene en una matriz en la memoria.
Todo estaba funcionando bien hasta que noté que el uso de la CPU llegaba al 100% en el tiempo. (en minutos después del primer cliente conectado) Al comienzo de la primera solicitud, todo parece ser normal, es decir, el uso de la CPU no es superior al 10% al devolver una respuesta al cliente. Pero a tiempo, incluso con 2 clientes, el uso de la CPU aumenta hasta el 100%. Parece que el uso de la CPU es del 100% solo cuando se escribe en una respuesta para una solicitud del cliente. Si no queda ningún cliente, todo vuelve a ser normal (el uso de la CPU es de aproximadamente 0%) hasta que un cliente realice una nueva solicitud web.
No conozco los hilos en detalle, pero sospecho de los nuevos hilos que he creado y que funcionan infinitamente. Es como que el sistema operativo les da más uso de CPU y recursos a tiempo ya que están trabajando todo el tiempo, y este Thread.Sleep (100) no funciona.
Aquí es el método 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
}
}
}
}
Espero que pueda explicar la situación, y estoy abierto a cualquier sugerencia, así (como la implementación de una manera diferente)
Si me puede ayudar con este problema lo agradeceré con gratitud, Gracias
¿Entonces, básicamente, debe verificar los nuevos mensajes cada N-milisegundos? ¿Es todo o algo más debe hacerse asincrónico? Si es así solo use async 'System.Threading.Timer' /' System.Timers.Timer' que se activará cada N-milisegundos. – sll
¿Es esto aproximadamente lo que estás tratando de lograr? while (true) {Thread.Sleep (100); foreach (var req en processRequest) {performProcessRequest (req);} processRequest.Remove (r => r.RequestCompletedOrTimedOut);} –
@sll: Necesito devolver la respuesta a un cliente (mensaje nuevo) ASAP
Dado que este es un chat aplicación, el período de verificación no debe ser demasiado largo, creo que debe ser menor de 1 segundo si utilizo el temporizador? – Mehmet