Ehi, sto cercando di implementare ConcurrentQueue in C# per un server asincrono. Gli articoli vengono messi in coda non appena viene ricevuto un messaggio completo. Per deselezionare i messaggi, sto facendo un piccolo numero di thread per fare il lavoro di dequeueing e manutenzione delle richieste. Questo è inadeguato poiché ogni thread utilizza un ciclo while, che consuma piuttosto una grande quantità di tempo del processore, per ovvi motivi.Eliminazione di oggetti da una ConcurrentQueue in C#
Qualcuno dovrebbe conoscere un metodo per eliminare i messaggi quando necessario, ma non consumare così tanto tempo di elaborazione.
{
...
for (int i = 0; i < 3; i++)
{
Thread t = new Thread(new ThreadStart(startParsingMessages));
t.Start();
}
...
}
private void startParsingMessages()
{
QueueContainer dequeued = null;
Console.WriteLine("Trying");
while (true)
{
if (queue.TryDequeue(out dequeued))
{
Console.WriteLine("processing queue");
ProcessMessage(dequeued.socket, dequeued.message);
}
}
}
+1 Quasi implichi che le raccolte simultanee siano solo lì per tornare a 'BlockingCollection' e non sono sicuro che sia vero. Ma tu sei morto con l'uso di 'BlockingCollection' qui per ridurre al minimo tutta la cerimonia per andare avanti con i tradizionali modelli produttore/consumatore. – Marc
@Marc: Non direi che è abbastanza vero fino a quel punto, ma penso che sarà l'uso * predominante *. Aggiornerò la risposta –
Ciao, grazie per i suggerimenti! Ho avvolto il mio ConcurrentQueue in BlockingCollection ei risultati sono fantastici. Sto eseguendo 20 thread contemporaneamente per mangiare attraverso la coda, con un tempo di blocco di 0,1 secondi per thread tramite il metodo TryTake (out T, TimeSpan s), e sta funzionando con un certo fascino. La richiesta viene sottoposta a manutenzione entro un lasso di tempo appropriato (più veloce che senza il concurrentqueue) e il carico della CPU non è mai stato inferiore. Grazie ancora! – user352891