Şaf*_*Gür 3 c# collections pool
我创建了一个池类,当被询问时,查找或初始化一个项目并将其返回给调用者.我使用a 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();
}
}
Run Code Online (Sandbox Code Playgroud)
ConcurrentBag听起来就像票.你需要自己处理空箱子,但它似乎很适合你的需求.特别是,ConcurrentBag.TryTake将从集合中获取一个项目,但不保证将返回任何特定项目.