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 に答える