¿Es seguro señalar e inmediatamente cerrar un ManualResetEvent?

Siento que debería saber la respuesta a esto, pero voy a preguntar de todos modos en caso de que esté cometiendo un error potencialmente catastrófico.

El siguiente código se ejecuta como se espera sin errores / excepciones:

static void Main(string[] args)
{
    ManualResetEvent flag = new ManualResetEvent(false);
    ThreadPool.QueueUserWorkItem(s =>
    {
        flag.WaitOne();
        Console.WriteLine("Work Item 1 Executed");
    });
    ThreadPool.QueueUserWorkItem(s =>
    {
        flag.WaitOne();
        Console.WriteLine("Work Item 2 Executed");
    });
    Thread.Sleep(1000);
    flag.Set();
    flag.Close();
    Console.WriteLine("Finished");
}

Por supuesto, como suele ser el caso con el código multiproceso, una prueba exitosa no prueba que esto sea realmente seguro para subprocesos. La prueba también tiene éxito si pongoClose antes deSet, a pesar de que la documentación establece claramente que intentar hacer algo después de unClose dará como resultado un comportamiento indefinido.

Mi pregunta es, cuando invoco elManualResetEvent.Set método, ¿está garantizado señalizartodas hilos de esperaantes de devolviendo el control a la persona que llama? En otras palabras, suponiendo que pueda garantizar que no habrá más llamadas aWaitOne, ¿es seguro cerrar el identificador aquí, o es posible que, en algunas circunstancias, este código impida que algunos camareros sean señalados o den como resultado unObjectDisposedException?

La documentación solo dice queSet lo pone en un "estado señalado" - no parece hacer ningún reclamo sobre cuándo los camareros lo haránen realidad obtener esa señal, así que me gustaría estar seguro.

Respuestas a la pregunta(4)

Su respuesta a la pregunta