【问题标题】:Can I use BlockingCollection for a network packet caching system?我可以将 BlockingCollection 用于网络数据包缓存系统吗?
【发布时间】:2014-11-18 19:19:45
【问题描述】:

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

【问题讨论】:

    标签: c# multithreading network-programming blockingcollection


    【解决方案1】:

    BlockingCollection&lt;T&gt; 就是这样工作的。如果从集合块中取出一个元素,那是因为没有什么可取的。唯一的“缓慢”在于为集合生成 I/O 项目。

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-19
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2018-06-02
      相关资源
      最近更新 更多