0

複数のコンシューマーを持つことができる BlockingCollection に似たコレクション オブジェクトを探しています。ただし、すべてのアイテムを消費するには、これらの複数の消費者が必要です。そこからアイテムを削除することはできません。基本的に、別のスレッドから項目を追加できるようにする必要があり、Enumerator を取得した人は、これまでに追加されたすべての項目をスクロールする必要があります。閉じるまでブロックします。

そのようなコレクションタイプはどこにありますか?

[編集] いいですね、明確にすると思います... BlockingCollection.GetConsumingEnumerable() は、アイテムが利用できない場合、または CompleteAdding が呼び出されるまで、列挙をブロックする列挙型を返します。コレクションからアイテムを削除しないことを除いて、同じものが欲しいです。

[編集] わかりました。なんでもいい。私はこれを解決しました:私自身のブロックリストを書くことで。

4

1 に答える 1

1

基本的に、別のスレッドからアイテムを追加できる必要があり、列挙子を取得した人は、これまでに追加されたすべてのアイテムをスクロールできると期待しています。

を直接使用できますがBlockingCollection<T>、「consumers」が。の結果ではなく、コレクション自体を列挙するようにしてGetConsumingEnumerable()ください。

MSDNから:

GetConsumingEnumerableとは異なり、BlockingCollection.IEnumerable.GetEnumeratorは、基になるコレクションを変更しない標準の列挙子を返します。

var collection = new BlockingCollection<int> { 5, 12, 20 };

//5, 12, 20
foreach (var i in collection)
{
    Console.WriteLine(i);
}

collection.Add(6);

// 5, 12, 20, 6
foreach (var i in collection)
{
    Console.WriteLine(i);
}

そして、それが閉じるまでブロックします。

コレクションに開いている列挙子がある間は、アイテムが追加されないようにすることを意味しますか?なんで?もちろん、これは実行可能です(たとえば、に裏打ちされたコレクションReaderWriterLockSlim)。

于 2013-02-01T07:13:13.397 に答える