Я реализовал универсальный класс ObjectPool, но обнаружил, что он иногда блокируется (происходит в Monitor.Wait (poolLock))
Может кто-нибудь заметить ошибку?
public class ObjectPool<T> where T : new()
{
private readonly object poolLock = new object();
Stack<T> stack = null;
public ObjectPool(int count)
{
stack = new Stack<T>(count);
for (int i=0; i<count; i++)
stack.Push(new T());
}
public T Get()
{
lock (poolLock)
{
//if no more left wait for one to get Pushed
while (stack.Count < 1)
Monitor.Wait(poolLock);
return stack.Pop();
}
}
public void Put(T item)
{
lock (poolLock)
{
stack.Push(item);
//If adding first send signal
if (stack.Count == 1)
Monitor.Pulse(poolLock);
}
}
использование
try
{
service = myPool.Get();
}
finally
{
if (service != null)
myPool.Put(service);
}