我可以将BlockingCollection用于网络数据包缓存系统吗?

时间:2014-11-18 19:19:46

标签: c# multithreading network-programming blockingcollection

我试图通过使用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.
    }  
}

1 个答案:

答案 0 :(得分:1)

这就是BlockingCollection<T>的工作方式。如果和从集合块中获取元素,那是因为没有什么可以采取的。唯一的“缓慢”是产生I / O的产品项目。

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

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