嘿,我想在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