#region copyright // ------------------------------------------------------ // Copyright (C) Dmitriy Yukhanov [https://codestage.net] // ------------------------------------------------------ #endregion using System; using System.Collections.Concurrent; namespace CodeStage.AntiCheat.Utils { public class ThreadSafeDisposablesPool where T : IDisposable, new() { private readonly ConcurrentBag objects; private readonly Func objectGenerator; public ThreadSafeDisposablesPool(Func objectGenerator) { this.objectGenerator = objectGenerator ?? throw new ArgumentNullException(nameof(objectGenerator)); objects = new ConcurrentBag(); } public T Get() { return objects.TryTake(out T item) ? item : objectGenerator(); } public void Release(T item) { objects.Add(item); } public void Dispose() { while (objects.TryTake(out T item)) { item.Dispose(); } } } }