我试图通过使用BlockingCollection来实现数据包生产者 - 消费者行为,但我无法理解其中的文档。据我所知,由于显然无法保证我可以删除任何内容,因此系统速度太慢,无法用于接收和处理数据包等性能关键的事情。我需要这个的原因是因为接收数据包的线程与处理它们的线程不同。我错过了什么,还是我需要采取另一种方法?
示例代码:
public BlockingCollection<byte[]> unprocessedPackets = new BlockingCollection<byte[]>();
public void Producer()
{
...Recieve packets...
unprocessedPackets.Add(packet);
}
public void Consumer(){
while(true)
{
byte[] packet = unprocessedPackets.Take();
...If i took something, process it.
}
}
答案 0 :(得分:1)
这就是BlockingCollection<T>
的工作方式。如果和从集合块中获取元素,那是因为没有什么可以采取的。唯一的“缓慢”是产生I / O的产品项目。
请注意,您可以将超时值传递给TryTake()
方法,这会导致它在放弃之前等待那段时间。但是如果你使用TryTake(out T item)
重载(即没有超时的重载),如果没有任何东西可以立即返回。
更典型的是消费者线程,除了检索要处理的项目之外什么都不做。在这种情况下,Take()
方法或GetConsumingEnumerable()
方法更合适。两者都将无限期阻止,直到有可用的项目为止。我更喜欢后者;它提供了一个非常好的,可用的机制,用于消费集合,以及当你知道没有任何东西时终止消费者(即生产代码调用CompleteAdding()
方法)。