无序线程安全集合用作池?

时间:2012-08-24 15:06:52

标签: c# collections pool

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

3 个答案:

答案 0 :(得分:5)

ConcurrentBag听起来就像票。你需要自己处理空箱子,但它似乎很适合你的需求。特别是,ConcurrentBag.TryTake会从集合中获取 项目,但不保证会返回任何特定项目。

答案 1 :(得分:1)

http://msdn.microsoft.com/en-us/library/dd381779

ConcurrentBag<T>ConcurrentQueue<T>

的无序等价物

答案 2 :(得分:0)

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