В основном структура данных, которую я хочу, будет отражать MSMQ, но будет в памяти, потому что она используется в одном процессе. Под зеркальным отображением MSMQ я имею в виду, что вы ставите объекты в очередь, а затем вы можете либо удалять объекты из очереди, либо извлекать их с помощью ключа. Вот моя первая попытка. Моя основная проблема с этой попыткой заключается в том, что Get by 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);
}
}
}