嘿,我正尝试在 C# 中为异步服务器实现一个 ConcurrentQueue。收到完整消息后,项目将立即排队。为了使消息出列,我创建了少量线程来完成出列和服务请求的工作。这是不够的,因为每个线程都使用一个 while 循环,这会消耗相当多的处理器时间,原因很明显。
有谁知道一种在需要时将消息出列但又不会消耗太多处理时间的方法。
{
...
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);
}
}
}
最佳答案
而不是使用 ConcurrentQueue<T>
直接地,你试过把它包装在 BlockingCollection<T>
中吗? ?然后你可以使用TryTake(out T, TimeSpan)
等等。我相信这是预期的用途:并发集合本身通常就在那里,这样您就可以选择阻塞集合的工作方式。
当然,这不一定是这些集合的唯一用途,但特别是 ConcurrentQueue<T>
,生产者/消费者队列场景是最常见的场景 - 此时 BlockingCollection<T>
是让做正确的事变得容易的方法。
关于c# - 从 C# 中的 ConcurrentQueue 中取出对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3502902/