У меня есть системное событие ручного сброса, которое я создаю, выполнив следующее:
EventWaitHandle notifyEvent = new EventWaitHandle(false, EventResetMode.ManualReset, notifyEventName, out createdEvent);
Несколько процессов создают это событие (например, оно является общим для них). Он используется для уведомления, когда что-то обновляется.
Я хотел бы иметь возможность установить это событие так, чтобы все процессы, ожидающие его, были сигнализированы, а затем немедленно сбросили его, чтобы последующие Ожидания события были заблокированы.
Если я сделаю
notifyEvent.Set();
notifyEvent.Reset();
Иногда он уведомляет все процессы прослушивания.
Если я сделаю
notifyEvent.Set();
Thread.Sleep(0);
notifyEvent.Reset();
Уведомление о большем количестве процессов (я предполагал, что это произойдет, поскольку у планировщика есть шанс на запуск).
А если я сделаю
notifyEvent.Set();
Thread.Sleep(100);
notifyEvent.Reset();
Тогда все, кажется, работает нормально, и все процессы (например, ~ 8) получают уведомления последовательно. Мне не нравится использование «магического номера» для вызова «Сон».
Есть ли лучший способ уведомить всех слушателей о событии ОС в других процессах о том, что событие произошло, чтобы каждый, кто слушает его во время уведомления, получил сигнал о событии, а затем немедленно сбросил событие, чтобы кто-либо еще, идет слушать событие будет блокировать?
ОБНОВЛЕНИЕ: Семафор, кажется, здесь не совсем подходит, так как количество слушателей события может меняться со временем. Заранее неизвестно, сколько будет слушателей, когда даже нужно будет уведомить.