gpt4 book ai didi

c# - 是否有并发排序字典或类似的东西?

转载 作者:行者123 更新时间:2023-11-30 16:02:16 25 4
gpt4 key购买 nike

对于我们一直在做的一个项目,我们使用了一个并发字典,这很好,直到出现一个新的规范要求对字典进行排序(它应该保持它添加的顺序,有点像 FIFO ).

这就是我们目前所做的,我们从字典中取出 x 数量(在本例中为 5)的项目:

private Dictionary<PriorityOfMessage, ConcurrentDictionary<Guid, PriorityMessage>> mQueuedMessages = new Dictionary<PriorityOfMessage, ConcurrentDictionary<Guid, PriorityMessage>>();


var messages = new List<KeyValuePair<Guid, PriorityMessage>>();
messages.AddRange(mQueuedMessages[priority].Take(5));

然后我们用它做一些事情,如果一切顺利,我们最终会删除它们。

mQueuedMessages[priority].TryRemove(messageOfPriority.Key);

但是,如果事情失败了,我们不会删除它们并稍后再试。不幸的是,没有并发排序的字典,但有没有办法确保消息保持它们添加的顺序?

非常重要的是我们可以从列表/字典中取出多个对象而不删除它们(或者我们需要能够稍后将它们添加到前面)。

最佳答案

How often will you take per second?

.

it could be a thousand times a second

每秒1000次锁操作绝对不算什么。这几乎不会消耗任何时间。

my colleague has already tried using locks and lists and he deemed it too slow

很可能这意味着锁定区域太大。我猜它是这样的:

lock (...) {
var item = TakeFromQueue();
Process(item);
DeleteFromQueue(item);
}

这不起作用,因为 Process 太慢了。它必须是:

lock (...)
var item = TakeFromQueue();

Process(item);

lock (...)
DeleteFromQueue(item);

你根本不会有任何性能问题。

您现在可以选择任何您喜欢的数据结构。您不再受内置并发数据结构功能的束缚。除了选择您喜欢的数据结构之外,您还可以对其执行任何您喜欢的操作,例如以原子方式获取多个项目。

我还没有完全理解您的需求,但听起来 SortedList 可能会朝着正确的方向发展。

关于c# - 是否有并发排序字典或类似的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37791150/

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