ID プロパティを持つ項目の ConcurrentQueue と各項目のタスクの ConcurrentQueue を持つアプリがあります。キュー項目は次のようになります。
class QueueItem {
public int ID { get; set; }
public ConcurrentQueue<WorkItem> workItemQueue { get; set; }
}
キュー自体は次のようになります。
ConcurrentQueue<QueueItem> itemQueue;
itemQueue に対して foreach を実行するスレッドが 1 つあります。各キューからアイテムを deQueue し、それに対して作業を行います。
foreach(var queueItem in itemQueue) {
WorkItem workItem;
if (queueItem.workItemQueue.TryDequeue(out workItem))
doWork(workItem);
else
// no more workItems for this queueItem
}
別のスレッドで itemQueue に queueItems を追加し、各 workItemQueue に workItems を追加する可能性があるため、ConcurrentQueues を使用しています。
私の問題は、queueItem に workItems がなくなったときに発生します - itemQueue からその queueItem を削除したい - のようなもの...
if (queueItem.workItemQueue.TryDequeue(out workItem))
doWork(workItem);
else
itemQueue.TryRemove(queueItem);
...しかし、私はそれを簡単に行う方法を見つけることができません。私が思いついた方法は、各 QueueItem をデキューし、workItemQueue にまだ WorkItems がある場合はそれをエンキューすることです。
for (int i = 0; i < itemQueue.Count; i++) {
QueueItem item;
itemQueue.TryDequeue(out queueItem);
if (queueItem.workItemQueue.TryDequeue(out workItem)) {
itemQueue.Enqueue(queueItem);
doWork(workItem);
}
else
break;
}
PFX ConcurrentQueue を使用して目的を達成するためのより良い方法はありますか、またはこれを行うための合理的な方法はありますか?カスタムの同時キュー/リストの実装を使用する必要がありますか、それとも何か不足していますか?