Хорошо, давайте разберем, что пытается сделать этот код ..
public class Buffer
{
public static OrderObject[] BufferCells;
public static Semaphore _pool { get; set; }
// Набор Один
public static void SetOne(OrderObject order)
{
// Зачем вам здесь семафор?
_pool.WaitOne();
try
{
// Семафор, является избыточным, поскольку Monitor.Enter является более строгой блокировкой.
Monitor.Enter(BufferCells);
// А? Я думал, что это должно быть SetOne? Не установлено все? Я могу только предположить, что вы намеревались установить одну из ячеек, в то время как остальные были доступны для настройки или получения. Очередь кажется более подходящей структурой данных, если это то, чего вы пытаетесь достичь. Еще лучше BlockingCollection
, который также имеет включенную механику блокировки / блокировки.
for (int i = 0; i < BufferCells.Length - 1; i++)
{
BufferCells[i] = order;
Console.WriteLine(String.Format("Client {0} Produced {1}", BufferCells[i].Id, BufferCells[i].Id));
}
}
finally
{
Monitor.Exit(BufferCells);
_pool.Release();
}
}
public static OrderObject GetOne()
{
// Опять же, этот семафор здесь не очень полезен
_pool.WaitOne();
OrderObject value = null;
try
{
// Потому что опять монитор имеет более ограничительную блокировку
Monitor.Enter(BufferCells);
for (int i = 0; i < BufferCells.Length - 1; i++)
{
if (BufferCells[i].Id != "-1")
{
value = BufferCells[i];
BufferCells[i] = new OrderObject() { Id = "-1" }; /*Clear Cell*/
Console.WriteLine(String.Format(" Server Consumed {0}", value.Id));
break;
}
}
}
finally
{
Monitor.Exit(BufferCells);
_pool.Release();
}
return value;
}
}
Подводя итог:
- В этом коде используется избыточная блокировка, которая не нужна
- Этот код устанавливает все ячейки в буфере одним махом под эксклюзивной блокировкой, которая, кажется, в первую очередь нарушает назначение буфера
- Похоже, что этот код пытается достичь, уже реализован в
BlockingCollection
. Не нужно изобретать велосипед! :)
Удачи!