我有一个应用程序,它有一个项目的 ConcurrentQueue,每个项目都有一个 ID 属性和一个任务的 ConcurrentQueue,队列项目如下所示:
class QueueItem {
public int ID { get; set; }
public ConcurrentQueue<WorkItem> workItemQueue { get; set; }
}
队列本身看起来像:
ConcurrentQueue<QueueItem> itemQueue;
我有一个线程在 itemQueue 上执行 foreach,从每个队列中取出一个项目并对其进行处理:
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 中没有更多 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 完成我想要的,或者这是一种合理的方法,我应该使用自定义并发队列/列表实现还是我错过了什么?