嘿,我想在C#中爲異步服務器實現ConcurrentQueue。一旦收到完整的消息,項目正在排隊。爲了使消息出隊,我使用少量線程來完成出隊和服務請求的工作。由於顯而易見的原因,每個線程都使用while循環,這會消耗相當大量的處理器時間,這是不夠的。從C中的ConcurrentQueue中離隊對象#
有人會知道在需要時將郵件出隊的方法,但不會消耗太多的處理時間。
{
...
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你幾乎意味着併發集合只是有''BlockingCollection',我不知道這是真的。但是,你在這裏使用'BlockingCollection'來減少所有與傳統的生產者/消費者模式相關的儀式。 – Marc 2010-08-17 13:46:07
@Marc:我不會說這是真的,但我認爲那會成爲主要的用途。我會更新答案。 – 2010-08-17 13:49:40
嗨,謝謝你的建議!我將我的ConcurrentQueue包裝在BlockingCollection中,結果非常棒。我通過隊列同時運行20個線程,通過TryTake(out T,TimeSpan s)方法每個線程的阻塞時間爲0.1秒,並且它正在發揮魅力。請求正在適當的時間內處理(比沒有併發隊列更快)並且CPU負載從未降低過。 再次感謝! – user352891 2010-08-20 12:25:07