ConcurrentQueueがある場合、Linqステートメントでそれを使用するための好ましい方法はありますか?すべてのアイテムをシーケンスとしてデキューするメソッドはなく、列挙子はアイテムを削除しません。
バッチ消費を行っています。つまり、キューが空になるまで処理して、さらにアイテムがキューに入れられるまでブロックするのではなく、定期的にキューを処理して空にします。BlockingCollectionは、最後のアイテムに到達したときにブロックされるため、機能しないようです。そのスレッドに、他のキューをクリアするなど、他の処理を実行させたいと思います。
static ConcurrentQueue<int> MyQueue = new ConcurrentQueue<int>();
void Main()
{
MyQueue.Enqueue(1);MyQueue.Enqueue(2);MyQueue.Enqueue(3);MyQueue.Enqueue(4);MyQueue.Enqueue(5);
var lst = MyQueue.ToLookup(x => x.SomeProperty);
//queue still has all elements
MyQueue.Dump("queue");
}
今のところ、私はヘルパーメソッドを作成しました
static IEnumerable<T> ReadAndEmptyQueue<T>(this ConcurrentQueue<T> q)
{
T item;
while(q.TryDequeue(out item))
{
yield return item;
}
}
var lk = MyQueue.ReadAndEmptyQueue().ToLookup(x => x.SomeProperty);
MyQueue.Dump(); //size is now zero
より良い方法はありますか、それとも私はそれを正しくやっていますか?