Я создал класс пула, который по запросу находит или инициализирует элемент и возвращает его вызывающей стороне. Я использую ConcurrentQueue<T>
в качестве базовой коллекции, но я не уверен, правильный ли это тип для использования.
Мне не нужно, чтобы элементы располагались в каком-либо определенном порядке, все, что мне нужно, - это поточно-ориентированная коллекция, которую я могу нажимать и извлекать. Есть ли в .NET класс быстрой коллекции для этой цели?
Изменить: я использовал ConcurrentBag<T>
после ответа спонсора:
public sealed class Pool<T>
{
private readonly Func<T> initializer;
private readonly ConcurrentBag<T> bag;
public Pool(Func<T> initializer)
{
if (initializer == null)
throw new ArgumentNullException("initializer");
this.initializer = initializer;
this.bag = new ConcurrentBag<T>();
}
public Pool(Func<T> initializer, IEnumerable<T> collection)
{
if (initializer == null)
throw new ArgumentNullException("initializer");
if (collection == null)
throw new ArgumentNullException("initializer");
this.initializer = initializer;
this.bag = new ConcurrentBag<T>(collection);
}
public Pool(Func<T> initializer, int allocationCount)
: this(initializer)
{
if (allocationCount < 0)
throw new ArgumentOutOfRangeException("allocationCount");
for (int i = 0; i < allocationCount; i++)
this.bag.Add(initializer.Invoke());
}
public void Push(T item)
{
this.bag.Add(item);
}
public T Pop()
{
T item;
return this.bag.TryTake(out item)
? item
: this.initializer.Invoke();
}
}