NLDClient-yudde/ProjectNLD/Assets/ThirdParty/AntiCheatToolkit/Runtime/Scripts/Utils/ThreadSafeDisposablesPool.cs

41 lines
971 B
C#
Raw Normal View History

2023-10-19 15:00:19 +08:00
#region copyright
// ------------------------------------------------------
// Copyright (C) Dmitriy Yukhanov [https://codestage.net]
// ------------------------------------------------------
#endregion
using System;
using System.Collections.Concurrent;
namespace CodeStage.AntiCheat.Utils
{
public class ThreadSafeDisposablesPool<T> where T : IDisposable, new()
{
private readonly ConcurrentBag<T> objects;
private readonly Func<T> objectGenerator;
public ThreadSafeDisposablesPool(Func<T> objectGenerator)
{
this.objectGenerator = objectGenerator ?? throw new ArgumentNullException(nameof(objectGenerator));
objects = new ConcurrentBag<T>();
}
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();
}
}
}
}