Joe Duffy's "Concurrent Programming On Windows" menciona esto (P311-312, P598). Este bit es interesante:
Nótese que en todos los ejemplos anteriores, las discusiones deben ser resistentes a algo que se llama espuria despertares
- código que utiliza variables de condición deben permanecer correcta y animado incluso en los casos en que se despierta prematuramente , es decir, antes de que se haya establecido la condición que se busca. Esto no se debe a que la implementación realmente hará tales cosas (aunque se sabe que algunas implementaciones en otras plataformas como Java y Pthreads lo hacen), ni porque el código activará los hilos intencionalmente cuando es innecesario, sino más bien porque no existe garantía en torno a cuándo se programará un hilo que se ha despertado. Las variables de condición no son justas. Es posible, e incluso probable, que otro hilo adquiera el bloqueo asociado y vuelva a falsear la condición antes de que el hilo despierto tenga la posibilidad de volver a adquirir el bloqueo y regresar a la región crítica.
A continuación, muestra el patrón normal durante un rato, comprobando la condición.
Yo diría que a partir de esto, es razonable esperar que Monitor.Wait
voluntad no normalmente se despierta antes de tiempo, y que si es absolutamente sabe que nada más puede haber cambiado la condición entonces podría poder salirse sin el ciclo de condición: pero que es más seguro incluirlo de todos modos, en caso de que tu lógica sea inexacta.
Hay un * lote * de comportamiento de .NET que 'debe documentarse', pero no es, por desgracia. –