Итак, я знаю, что вы можете использовать семафор и, возможно, другие методы, чтобы определить, будет ли блокировка успешной и / или сколько потоков ожидает блокировку, но можете ли вы сделать это из самой блокировки?
В моей ситуации есть обработчик событий, который может вызываться многими объектами в List
.Я хочу сделать тест в замке, чтобы увидеть, все ли объекты находятся в правильном состоянии, прежде чем продолжить.Объекты переходят в соответствующее состояние , а затем вызывают это событие, поэтому в модели с одним потоком, когда последний вызывает это событие, все объекты будут в правильном состоянии, и мы продолжаем.Но мне пришло в голову, что с несколькими потоками несколько объектов могут быть переведены в состояние, которое я проверяю, но пока еще не обработали это событие, поскольку они ожидают блокировки.Поэтому проверка условного состояния в пределах блокировки будет истинной, но продолжение будет плохим, пока все потоки не завершат обработку этого события.Мне нужно, чтобы это было верно только в том случае, если последний поток обрабатывается, чтобы гарантировать, что мы не продолжим слишком быстро.
Например, в полуреалистичном коде:
object _LockObj = new object();
void Event_Handler(object sender, EventArgs e)
{
MyObject originator = sender as MyObject;
if(originator == null)
return;
*Do stuff with the originator*
lock(_LockObj)
{
if(ListOfMyObjects.FindAll(o => o.State == DesiredState)
.Count == ListOfMyObjects.Count
&& *nothing waiting at the lock*)
{
*Proceed*
}
}
}
Я отлично подготовленсогласиться с моим подходом - вонючее начало, и что решение, которое я ищу, является спорным, если я делаю это правильно, во-первых, но я не уверен, как сделать это правильно в многопоточном режиме.
Я собирался добавить еще несколько состояний в MyObject
и управлять потоком, установив соответствующее состояние в разделе *Do stuff with the originator*
, но было не правильно корректировать переход MyObject отсюда, не говоря уже оЗатем я должен реализовать состояние удержания для каждого состояния, которое вызывает событие, которое становится еще проще, а не просто!
Так что, если есть простой способ сделать ' ничего, ожидающего в замке «Тогда проверьте, что я бы хотел пойти по этому пути, если только не пропущен действительно простой для реализации шаблон, который помогает в этом сценарии.