public ReplicaRegistry(Options?options = null) { options ??= new Options(); _handles = new ConcurrentDictionary <PublicationRef, GCHandle>(options.ConcurrencyLevel, options.InitialCapacity); _opCounter = new StochasticCounter(1); _gcHandlePool = options.GCHandlePool ?? new GCHandlePool(GCHandleType.Weak); if (_gcHandlePool.HandleType != GCHandleType.Weak) { throw new ArgumentOutOfRangeException( $"{nameof(options)}.{nameof(options.GCHandlePool)}.{nameof(_gcHandlePool.HandleType)}"); } UpdatePruneCounterThreshold(); }
public ComputedRegistry(Options?options = null) { options = options.OrDefault(); _storage = new ConcurrentDictionary <ComputedInput, GCHandle>(options.ConcurrencyLevel, options.InitialCapacity); var locksProvider = options.LocksProvider; if (locksProvider == null) { var locks = new AsyncLockSet <ComputedInput>(ReentryMode.CheckedFail); locksProvider = _ => locks; } _locksProvider = locksProvider; _gcHandlePool = options.GCHandlePool ?? new GCHandlePool(GCHandleType.Weak); if (_gcHandlePool.HandleType != GCHandleType.Weak) { throw new ArgumentOutOfRangeException( $"{nameof(options)}.{nameof(options.GCHandlePool)}.{nameof(_gcHandlePool.HandleType)}"); } _opCounter = new StochasticCounter(); UpdatePruneCounterThreshold(); }
// プール経由で開放する public void Dispose() { GCHandlePool.Release(handle); handle = default; }
// Pool経由で作成する public void Create(T value) { handle = GCHandlePool.Create(value); }