У меня есть приложение, у которого есть ConcurrentQueue элементов, у которых есть свойство ID и ConcurrentQueue задач для каждого элемента, элементы очереди выглядят так:
class QueueItem {
public int ID { get; set; }
public ConcurrentQueue<WorkItem> workItemQueue { get; set; }
}
и сама очередь выглядит так:
ConcurrentQueue<QueueItem> itemQueue;
У меня есть один поток, выполняющий foreach над itemQueue, выписывающий элемент из каждой очереди и работающий над ним:
foreach(var queueItem in itemQueue) {
WorkItem workItem;
if (queueItem.workItemQueue.TryDequeue(out workItem))
doWork(workItem);
else
// no more workItems for this queueItem
}
Я использую ConcurrentQueues, потому что у меня есть отдельный поток, потенциально добавляющий queueItems к itemQueue и добавляющий workItems к каждому workItemQueue.
Моя проблема возникает, когда у меня больше нет рабочих элементов в queueItem - я хотел бы удалить этот queueItem из itemQueue - что-то вроде ...
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, или это разумный способ сделать это, если я использую пользовательскую реализацию очереди / списка или я что-то упустил?