7

単一のプロデューサー、単一のコンシューマーのFIFOクエリが必要です。

  • 受信した順にメッセージを処理する必要があります。
  • メッセージを処理している間、呼び出し元は待機するべきではないため、これを非同期で行う必要があります。
  • 次のメッセージ処理は、前のメッセージ処理が終了したときにのみ開始する必要があります。「受信」メッセージの頻度は、「処理」メッセージの頻度よりも高い場合があります。しかし、平均して、すべてのメッセージを処理できるはずです。たまに、それらのパックを「キューに入れる」必要があります。

つまり、TCP / IPと非常によく似ており、プロデューサーとコンシューマーが1つずつあり、処理するよりも速くメッセージを受信できる場合があるため、クエリを実行する必要があります。順序が重要であり、発信者がそのようなもので何をしているのかまったく興味がない場合。

これは簡単そうに聞こえますし、一般的なものを使用できる可能性がありますが、 etcを使用してコードを記述したくないので、これQueueを使用したいと思います。BlockingCollectionManualResetEvent

私の仕事にどれほど適しBlockingCollectionていますか、そしておそらくあなたは何か他のものを提案することができますか?

4

2 に答える 2

12

BlockingCollectionクラスはIProducerConsumerCollectionインターフェイスを実装しているため、要件に完全に適合します。

2つのタスクを作成できます。1つは非同期プロデューサー用で、もう1つはコンシューマーワーカー用です。前者はアイテムをに追加しBlockingCollection、後者は新しいものがFIFO順に利用可能になるとすぐに消費します。

TPLタスクBlockingCollectionを使用した生産者/消費者サンプルアプリケーション:

class ProducerConsumer
{
    private static BlockingCollection<string> queue = new BlockingCollection<string>();

    static void Main(string[] args)
    {
        Start();
    }

    public static void Start()
    {
        var producerWorker = Task.Factory.StartNew(() => RunProducer());
        var consumerWorker = Task.Factory.StartNew(() => RunConsumer());

        Task.WaitAll(producerWorker, consumerWorker);
    }

    private static void RunProducer()
    {
        int itemsCount = 100;

        while (itemsCount-- > 0)
        {
            queue.Add(itemsCount + " - " + Guid.NewGuid().ToString());
            Thread.Sleep(250);
        }
    }

    private static void RunConsumer()
    {
        foreach (var item in queue.GetConsumingEnumerable())
        {
           Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.ffff") + " | " + item);
        }
    }
}

IProducerConsumerCollection

プロデューサー/コンシューマーの使用を目的としたスレッドセーフなコレクションを操作するメソッドを定義します。このインターフェイスは、プロデューサー/コンシューマーコレクションの統一された表現を提供するため、System.Collections.Concurrent.BlockingCollection(Of T)などの高レベルの抽象化では、コレクションを基盤となるストレージメカニズムとして使用できます。

于 2012-04-11T09:36:33.190 に答える
0

必要なキューなので、キューにこだわってみませんか?同期キューを使用できます。

于 2012-04-11T09:17:57.140 に答える