1

我正在尝试通过使用 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.
    }  
}
4

1 回答 1

2

就是这样BlockingCollection<T>工作的。如果并且当从集合块中获取元素时,那是因为没有什么可取的。唯一的“缓慢”在于为集合生成 I/O 项目。

请注意,您可以将超时值传递给该TryTake()方法,这将导致它在放弃之前等待该时间长度。但是如果你使用TryTake(out T item)重载(即没有超时的),如果没有什么可取的,它会立即返回。

更典型的是一个消费者线程,它除了检索要处理的项目之外什么都不做。在这种情况下,Take()方法或GetConsumingEnumerable()方法更合适。两者都将无限期地阻止,直到有可用的项目。我更喜欢后者;它提供了一种非常好的、可用的机制,既可以用于消费集合,也可以在您知道没有任何剩余时终止消费者(即,该CompleteAdding()方法由生产代码调用)。

于 2014-11-18T20:34:33.397 回答