Sto implementando una piattaforma di chat basata sul Web nell'applicazione Web ASP.NET e utilizzo una tecnica simile al polling lungo. Voglio dire, tengo ogni richiesta web dal client per un periodo di tempo specifico (timeout) o fino a quando arriva un nuovo messaggio, e quindi la risposta viene inviata al client.utilizzo della cpu che aumenta fino al 100% nel ciclo infinito nella filettatura
Conservo i client connessi in memoria (oggetto dizionario) e quando un nuovo messaggio viene inviato a un client, scrivo questo messaggio nell'array dei messaggi del client ricevente. Il client deve inviare una richiesta per ottenere i propri messaggi e mantengo questa richiesta in una matrice in memoria.
Sto utilizzando il gestore HTTP asincrono per la richiesta del client di ascolto, sto mantenendo le richieste Web in una matrice in memoria. Uso i thread per verificare continuamente i nuovi messaggi dalla memoria (nel dizionario creato per ciascun client).
Non faccio uso di .NET discussioni pool di thread per verificare la presenza di nuovi messaggi o cronometrato fuori requests.I web di creare discussioni in questo modo:
System.Threading.Thread t = new Thread(new ThreadStart(QueueCometWaitRequest_WaitCallback));
t.IsBackground = false;
t.Start();
Nel metodo QueueCometWaitRequest_WaitCallback di ogni thread mi trovo in un infinito ciclo while:
while (true)
{
...
Thread.Sleep(100);
}
in questo metodo, sto controllando per la richiesta web time out o un nuovo messaggio per ogni richiesta Web, che è anche tenuto in una matrice in memoria.
Tutto funzionava bene fino a quando ho notato che l'utilizzo della CPU raggiunge il 100% nel tempo. (in minuti dopo il primo client connesso) All'inizio della prima richiesta tutto sembra essere normale, voglio dire che l'utilizzo della CPU non è superiore al 10% mentre si restituisce una risposta al client. Ma con il tempo anche con 2 client l'utilizzo della CPU aumenta fino al 100%. Sembra che l'utilizzo della CPU sia al 100% solo quando si scrive una risposta per una richiesta del client. Se non viene lasciato alcun client, tutto torna a essere normale (l'utilizzo della CPU è pari a circa lo 0%) fino a quando una nuova richiesta Web non viene eseguita da un client.
Non conosco i thread in dettaglio, ma sono sospettoso riguardo ai nuovi thread che ho creato e che funziona all'infinito. È come se il sistema operativo fornisse loro più risorse e risorse in termini di tempo poiché funzionavano sempre e questo Thread.Sleep (100) non funziona.
Ecco il metodo 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
}
}
}
}
Spero di poter spiegare la situazione, e sono aperto a qualsiasi suggerimento così (come implementare in modo diverso)
Se mi può aiutare con questo problema apprezzerò riconoscente, Grazie
Quindi, in pratica, è necessario verificare la presenza di nuovi messaggi ogni millisecondo N? È tutto o qualcos'altro dovrebbe essere fatto asincrono? Se è così basta usare async 'System.Threading.Timer' /' System.Timers.Timer' che dovrebbe attivare ogni N millisecondi. – sll
Questo è approssimativamente quello che stai cercando di realizzare? while (true) {Thread.Sleep (100); foreach (var req in processRequest) {performProcessRequest (req);} processRequest.Remove (r => r.RequestCompletedOrTimedOut);} –
@sll: Devo restituire la risposta a un client (nuovo messaggio) ASAP
Poiché si tratta di una chat applicazione, il periodo di controllo non dovrebbe essere troppo lungo, penso che debba essere inferiore a 1 secondo se utilizzo il timer? – Mehmet