Неупорядоченная потокобезопасная коллекция для использования в качестве пула?

Я создал класс пула, который по запросу находит или инициализирует элемент и возвращает его вызывающей стороне. Я использую 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();
    }
}

person Şafak Gür    schedule 24.08.2012    source источник


Ответы (3)


ConcurrentBag звучит как билет. Вам нужно будет разобраться с пустым футляром самостоятельно, но, похоже, он вполне соответствует вашим потребностям. В частности, ConcurrentBag.TryTake получит элемент из коллекции без гарантии, что какой-либо конкретный товар будет возвращен.

person spender    schedule 24.08.2012
comment
Можете ли вы подробнее рассказать об этом? Может быть, включить пример его использования? Ответы только на ссылки не одобряются. - person George Stocker; 24.08.2012

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

ConcurrentBag<T> - неупорядоченный эквивалент ConcurrentQueue<T>

person Nick Jones    schedule 24.08.2012

ConcurrentBag - это неупорядоченная коллекция, ориентированная на многопоточность.

person daryal    schedule 24.08.2012