21

時間とメモリの点で、構築するのにコストがかかるクラスがあります。これらのプールを維持し、オンデマンドで同じプロセス内の複数のスレッドに分配したいと考えています。

すでにテストおよび証明されている汎用オブジェクト プールはありますか? (COM+ プーリングは必要ありません。)

4

6 に答える 6

23

MSDN から直接引用した、.NET 4 で新しい同時実行コレクション型の 1 つを使用する例を次に示します。

System.Collections.Concurrent.ConcurrentBag<T>次の例は、バッキング ストアとして を使用してオブジェクト プールを実装する方法を示しています。

public class ObjectPool<T>
{
    private ConcurrentBag<T> _objects;
    private Func<T> _objectGenerator;

    public ObjectPool(Func<T> objectGenerator)
    {
        if (objectGenerator == null)
            throw new ArgumentNullException("objectGenerator");
        _objects = new ConcurrentBag<T>();
        _objectGenerator = objectGenerator;
    }

    public T GetObject()
    {
        T item;
        if (_objects.TryTake(out item))
            return item;
        return _objectGenerator();
    }

    public void PutObject(T item)
    {
        _objects.Add(item);
    }
}
于 2009-11-04T05:00:51.013 に答える
5

Cheeso はありません。このような一般的なオブジェクト プールはありません。しかし、それは良い考えです。これはかなり簡単に開発できると思います。重要なことは、スレッド化された環境でうまく機能させることです。

これは興味深い設計上の問題だと思います。たとえば、これをサーバー クラスのハードウェアでスケーリングする必要がある場合、そしてオブジェクトを個々のスレッドに頻繁に渡す場合は、次のようにします。

  1. オブジェクトの単一の中央プールを保持します。
  2. スレッドに対して初めて呼び出されたとき、および空になったときに設定されるスレッドごとのプール (キャッシュ) を保持します。

このようにして、ほとんどのリクエストでスレッドごとの競合を回避します。

運用条件が異なれば、設計も異なります。たとえば、オブジェクトの割り当てがまれであるか、スレッドの数が少ない場合は、コレクションをロックするだけの方が簡単な場合があります。これはうまく拡張できませんが、この場合は拡張する必要があります。

クラスまたはインターフェイスを正しく設計すると、より複雑なシナリオを処理するために、時間の経過とともに実装を変更できます。

于 2009-11-04T05:03:13.763 に答える
0

共有するだけです。モデルとして Apache 共通プールを使用して、一般的な .net 共通プール ライブラリを作成しました。 http://cobrary.wordpress.com/net-common-pool-library/

于 2013-04-08T06:07:00.097 に答える