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

Vin*_*ent 4 c# concurrency sorteddictionary

对于我们一直在研究的一个项目,我们使用了一个并发字典,这很好,直到出现一个要求对字典进行排序的新规范(它应该保持添加的顺序,有点像 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));
Run Code Online (Sandbox Code Playgroud)

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

mQueuedMessages[priority].TryRemove(messageOfPriority.Key);
Run Code Online (Sandbox Code Playgroud)

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

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

usr*_*usr 5

你每秒需要多少次?

.

它可能是每秒一千次

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

我的同事已经尝试过使用锁和列表,但他认为它太慢了

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

lock (...) {
 var item = TakeFromQueue();
 Process(item);
 DeleteFromQueue(item);
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为Process太慢了。肯定是:

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

 Process(item);

lock (...)
 DeleteFromQueue(item);
Run Code Online (Sandbox Code Playgroud)

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

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

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