基本上,我想要的数据结构将镜像 MSMQ,但将存储在内存中,因为它仅在一个进程中使用。通过镜像 MSMQ,我的意思是您可以将对象加入队列,然后使用键获取或者出队对象。以下是我的初步尝试。我对此尝试的主要问题是,按 ID 获取将经常被使用,因此队列最终会有很多“死”对象。
public class QueueDictionary<TKey, TValue>
{
private readonly Queue _queue = new Queue();
private readonly Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey, TValue>();
private readonly object _syncRoot = new object();
public TValue Dequeue()
{
lock (_syncRoot)
{
TKey key = (TKey)_queue.Dequeue();
while (!_dictionary.ContainsKey(key))
key = (TKey)_queue.Dequeue();
return _dictionary[key];
}
}
public TValue Get(TKey key)
{
lock (_syncRoot)
{
TValue result = _dictionary[key];
_dictionary.Remove(key);
return result;
}
}
public void Enqueue(TKey key, TValue value)
{
lock (_syncRoot)
{
_dictionary.Add(key, value);
_queue.Enqueue(key);
}
}
}
获取
中删除任何内容...而且如果您不欺骗它,您似乎不需要while
循环... 顺便说一下,这个循环应该保护自己免受空队列的影响。 - Marc GravellGet
的意图是从队列中删除对象吗?还是仅仅是一个“查看”接口? - Marc Gravell