Tengo un caso de rearme manual en todo el sistema que se crea haciendo lo siguiente:notificar correctamente todos los oyentes de un sistema de amplia nombrada caso de rearme manual e inmediatamente después de restablecerlo
EventWaitHandle notifyEvent = new EventWaitHandle(false, EventResetMode.ManualReset, notifyEventName, out createdEvent);
Varios procesos de creación de este evento (por ejemplo, se comparte entre ellos). Se usa para notificar cuando algo se actualiza.
Me gustaría poder configurar este evento para que todos los procesos que esperan en él se señalicen y luego reiniciarlo inmediatamente para que las siguientes Esperas en el evento estén bloqueadas.
Si hago un
notifyEvent.Set();
notifyEvent.Reset();
A veces se notificará a todos los procesos de escucha.
si hago un
notifyEvent.Set();
Thread.Sleep(0);
notifyEvent.Reset();
Más procesos recibir una notificación (I supone que esto sucedería ya que el programador tiene la oportunidad de correr).
Y si lo hago
notifyEvent.Set();
Thread.Sleep(100);
notifyEvent.Reset();
Entonces todo parece funcionar bien y todos los procesos (por ejemplo, ~ 8) Se puede notificarse de forma coherente. No me gusta el uso de un "número mágico" para la llamada Sleep.
Hay una mejor manera de notificar a todos los oyentes de un evento del sistema operativo en otros procesos que un evento ha ocurrido para que todos los que escuchan en el momento de la notificación reciban la señal de evento y restablecer inmediatamente el evento para que cualquier otra persona que va a escuchar el evento bloqueará?
ACTUALIZACIÓN: Un semáforo no parece ser una buena opción aquí ya que el número de oyentes del evento puede variar con el tiempo. No se sabe de antemano cuántos oyentes habrá cuando se necesite notificar a un par.
Aceptaré esta respuesta, pero parece que el sistema operativo aún debería permitir que funcione una mano :) –