13

ブロッキング プライオリティ キューを構築する必要があり、それTakeFromAnyが秘密の要素である可能性があると思いますが、そのメソッドに関するドキュメントはまばらです。その目的/適切な使用は何ですか?

私の要件は、複数のスレッドが優先度の高いキューまたは優先度の低いキューに追加されることです。1 つのスレッドがこれら 2 つのキューを消費し、優先度の低いキューの前に常に優先度の高いキューから取得します。

BlockingCollectionどちらもthe メソッドも the methodも役に立たない可能性は十分にありTakeFromAnyます。もしそうなら、正しい方向へのポインタをいただければ幸いです。

4

1 に答える 1

13

あなたが正しいです。ドキュメントはかなりまばらです。ただし、Reflector を介した実装を調べたところ、このBlockingCollection.TakeFromAny方法を使用して、希望する優先バイアスをシミュレートできると思います。その理由は、実装WaitHandle.WaitAnyがすべてのシグナルされたオブジェクトの最小のインデックスを返すメソッドを使用するためです。つまり、アイテムが利用可能なキューが 2 つ以上ある場合、配列内で最初に表示されるキューが常に選択されます。

次のコードは、常に「ハイ」を出力する必要があります。

var low = new BlockingCollection<object> { "low" };
var high = new BlockingCollection<object> { "high" };
var array = new BlockingCollection<object>[] { high, low };
object item;
int index = BlockingCollection<object>.TakeFromAny(array, out item);
Console.WriteLine(item);
于 2010-09-13T13:54:44.737 に答える