C# Connectionpool

Date: 2019-08-27
// using System;
// using System.Linq;
// using System.Collections.Concurrent;
public class Pool<T>
{
	private readonly ConcurrentQueue<T> _queue = new ConcurrentQueue<T>();
	private readonly Func<T> _createOne;
	private readonly int _targetSize;
	public Pool(Func<T> createOne, int initialSize = 1, int targetSize = 3)
	{
		_createOne = createOne;
		_targetSize = targetSize;
		Enumerable.Range(0, initialSize).ToList()
			.ForEach(x => ReleaseOne(CreateOne()));
	}
	public T GetOne()
	{
		if (_queue.TryDequeue(out var item))
		{
			return item;
		}
		else
		{
			return CreateOne();
		}
	}
	private T CreateOne()
	{
		return _createOne();
	}
	public void ReleaseOne(T item)
	{
		if (_queue.Count < _targetSize)
		{
			_queue.Enqueue(item);
		}
		else if (item is IDisposable disposable)
		{
			disposable.Dispose();
		}
	}
}
25210cookie-checkC# Connectionpool