3

要求されたときに項目を検索または初期化し、呼び出し元に返すプール クラスを作成しました。基になるコレクションとして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();
    }
}
4

3 に答える 3

5

ConcurrentBagは単なるチケットのように聞こえます。空のケースは自分で処理する必要がありますが、ニーズにぴったり合っているようです。特に、ConcurrentBag.TryTakeはコレクションから項目を取得ますが、特定の項目が返されるという保証はありません。

于 2012-08-24T15:08:10.460 に答える
1

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

ConcurrentBag<T>の順序付けられていない等価物ですConcurrentQueue<T>

于 2012-08-24T15:10:22.293 に答える
0

ConcurrentBagは順序付けられていないコレクションであり、スレッド セーフです。

于 2012-08-24T15:10:22.583 に答える