2012-08-24 28 views
3

我创建了一个池类,当询问时,查找或初始化一个项目并将其返回给调用者。我使用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(); 
    } 
} 

回答

5

ConcurrentBag听起来好像只是门票。你需要自己处理空箱子,但它似乎很适合你的需求。特别是,ConcurrentBag.TryTake会抢从集合项目没有保证任何特定的一个将被退回。

+2

你可以扩展吗?也许包括它的用法的一个例子?链接只有答案是皱眉。 –

0

ConcurrentBag无序equavalent是一个无序的集合,它是线程安全的。