gpt4 book ai didi

c# - PFX ConcurrentQueue - 有没有办法从队列中删除特定项目

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:34 35 4
gpt4 key购买 nike

我有一个应用程序,它有一个 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 中没有更多的 workItem 时,我的问题就来了——我想从 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 来完成我想要的,或者这是一个合理的方法,我应该使用自定义并发队列/列表实现还是我遗漏了什么?

最佳答案

一般来说,没有有效的方法可以从队列中删除特定的项目。它们通常有 O(1) 的队列和出队,但 O(n) 的删除,这就是您的实现所做的。

另一种结构称为 LinkedHashMap。看看 Java implementation如果你感兴趣。

它本质上是一个哈希表一个链表,它允许 O(1) 排队、出队和删除。

这还没有在 .Net 中实现,但是网络上有一些实现。

现在的问题是,为什么 itemQueue 是一个队列?从您的代码示例中,您永远不会从中入队或出队(除了绕过 Remove 问题)。我怀疑如果使用更合适的数据结构可以简化您的问题。您能否举例说明其他哪些代码段访问 itemQueue?

关于c# - PFX ConcurrentQueue - 有没有办法从队列中删除特定项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/683956/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com