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)
但是,如果事情失败,我们不会删除它们并稍后再试。不幸的是,没有并发排序字典,但是有没有办法确保消息保持它们添加的顺序?
非常重要的是我们可以从列表/字典中获取多个对象而不删除它们(或者我们需要能够稍后将它们添加到前面)。
你每秒需要多少次?
.
它可能是每秒一千次
每秒 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可能朝着正确的方向发展。
| 归档时间: |
|
| 查看次数: |
5447 次 |
| 最近记录: |