3

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

より良い方法はありますか、それとも私はそれを正しくやっていますか?

4

1 に答える 1