/// <summary>
        /// Конструктор PrioritizedElementsContainer
        /// </summary>
        /// <param name="comparer">Объект для сравнения элементов</param>
        public PrioritizedElementsContainer(PoolElementComparer <T> comparer)
        {
            Contract.Requires <ArgumentNullException>(comparer != null);

            _allElements      = new SparceArrayStorage <PoolElementWrapper <T> >(true);
            _comparer         = comparer;
            _occupiedElements = new SemaphoreLight(0);
            _syncObject       = new object();
        }
        /// <summary>
        /// Конструктор PrioritizedElementsContainer
        /// </summary>
        /// <param name="comparer">Объект для сравнения элементов</param>
        public PrioritizedElementsContainer(PoolElementComparer <T> comparer)
        {
            if (comparer == null)
            {
                throw new ArgumentNullException(nameof(comparer));
            }

            _allElements      = new SparceArrayStorage <PoolElementWrapper <T> >(true);
            _comparer         = comparer;
            _occupiedElements = new SemaphoreLight(0);
            _syncObject       = new object();
        }
        /// <summary>
        /// <see cref="BalancingStaticPoolManager{TElem}"/> constructor
        /// </summary>
        /// <param name="comparer">Comparer which will be used to select the best element from pool</param>
        /// <param name="name">Name for the current <see cref="BalancingStaticPoolManager{TElem}"/> instance</param>
        /// <param name="destroyAction">The action that will be performed to destroy each element after removal ('null' means no action)</param>
        public BalancingStaticPoolManager(PoolElementComparer <TElem> comparer, string name, Action <TElem> destroyAction)
        {
            _name          = name ?? this.GetType().GetCSFullName();
            _destroyAction = destroyAction;
            _comparer      = comparer ?? PoolElementComparer <TElem> .CreateDefault();

            _elementsContainer   = new PrioritizedElementsContainer <TElem>(_comparer);
            _stoppedEvent        = new ManualResetEventSlim(false);
            _disposeCancellation = new CancellationTokenSource();

            Profiling.Profiler.ObjectPoolCreated(this.Name);
        }
 /// <summary>
 /// <see cref="BalancingStaticPoolManager{TElem}"/> constructor
 /// </summary>
 /// <param name="comparer">Comparer which will be used to select the best element from pool</param>
 /// <param name="name">Name for the current <see cref="BalancingStaticPoolManager{TElem}"/> instance</param>
 /// <param name="disposeElementOnDestroy">Whether the <see cref="IDisposable.Dispose"/> should be called for element after removal</param>
 public BalancingStaticPoolManager(IComparer <TElem> comparer, string name, bool disposeElementOnDestroy)
     : this(PoolElementComparer <TElem> .Wrap(comparer), name, disposeElementOnDestroy ? new Action <TElem>(CallElementDispose) : null)
 {
 }
 /// <summary>
 /// <see cref="BalancingStaticPoolManager{TElem}"/> constructor
 /// </summary>
 /// <param name="comparer">Comparer which will be used to select the best element from pool</param>
 /// <param name="name">Name for the current <see cref="BalancingStaticPoolManager{TElem}"/> instance</param>
 /// <param name="destroyAction">The action that will be performed to destroy each element after removal ('null' means no action)</param>
 public BalancingStaticPoolManager(IComparer <TElem> comparer, string name, Action <TElem> destroyAction)
     : this(PoolElementComparer <TElem> .Wrap(comparer), name, destroyAction)
 {
 }
 /// <summary>
 /// <see cref="BalancingStaticPoolManager{TElem}"/> constructor
 /// </summary>
 public BalancingStaticPoolManager()
     : this(PoolElementComparer <TElem> .CreateDefault(), null, null)
 {
 }
 /// <summary>
 /// <see cref="BalancingStaticPoolManager{TElem}"/> constructor
 /// </summary>
 /// <param name="comparer">Comparer which will be used to select the best element from pool</param>
 /// <param name="name">Name for the current <see cref="BalancingStaticPoolManager{TElem}"/> instance</param>
 public BalancingStaticPoolManager(IComparer <TElem> comparer, string name)
     : this(PoolElementComparer <TElem> .Wrap(comparer), name, null)
 {
 }