0

エンドポイントに送信される同様のメッセージ タイプを保持する 2 つのキューがあるとします。キューの 1 つ (キュー A) の優先度が最も高いため、そのメッセージを常に最初に送信する必要があります。2 番目のキュー (キュー B) のメッセージは優先度が低く、キュー A が空のときにのみ送信する必要があります。これら 2 つのキューを含むコードを記述し、上記のロジックに基づいてその内容を送信する必要があります。キューが空になり、新しいメッセージが到着するのを待っているときにシステムがハングしないように、新しいスレッドでこれを行う必要があると想定しています。私が知りたいのは、これに適したパターンはありますか? C# の「キュー」タイプを使用する必要がありますか? してはいけないことについて何かアドバイスはありますか?

4

2 に答える 2

1

BlockingCollection<T>キューにa を使用し、ConcurrentPriorityQueue<T>

あなたはあなたを作成し、それを受け取るコンストラクタにConcurrentPriorityQueue渡しますBlockingCollectionIProducerConsumerCollection

次に、生産者スレッドが異なる優先度の作業項目を追加する順序に関係なく、消費者スレッドは優先度の高い項目を最初に削除します。

于 2013-04-08T11:43:19.227 に答える
1

ConcurrentQueue<T> クラスは、キューのスレッド セーフな実装を提供します。2 つのインスタンスを結合してプライオリティ キューを形成し、IProducerConsumerCollection<T> インターフェイスを実装して、 BlockingCollection<T> Classでラップできるようにすることができます。次に、任意のスレッドがアイテムをキューに追加でき、1 つのスレッドがGetConsumingEnumerable Methodを使用してアイテムを消費します。

enum Priority
{
    Low,
    High,
}
struct Prioritized<T>
{
    public Priority Priority;
    public T Item;
}
class PriorityQueue<T> : IProducerConsumerCollection<Prioritized<T>>
{
    private readonly ConcurrentQueue<T> low;
    private readonly ConcurrentQueue<T> high;

    ...
}
于 2013-04-08T11:33:21.257 に答える