WaitHandles выглядят очень похоже на Wait / Pulse Constructs, но разница в деталях: метод WaitHandles Set устанавливает Signal, даже если ни один поток не ожидает. Это означает, что если вы вызываете Set в потоке, а затем вызываете WaitOne в другом потоке с той же ручкой ожидания, второй поток будет продолжен. Ожидание и Pulse отличаются, Pulse сигнализирует только о потоке, который уже находится в очереди ожидания. Это означает, что если вы вызываете Pulse в потоке, а затем вызываете Wait в другом потоке для того же объекта, второй поток будет ждать вечно (тупик). Вы должны быть чрезвычайно осторожны, если используете Wait и Pulse, используйте его, только если вы знаете, что делаете, иначе вам может повезти ...
Чтобы создать поведение WaitHandle самостоятельно с помощью Monitor, Weather Reset или ManualReset, вам нужно сделать гораздо больше, чем просто Wait / Pulse Construct. Просто используйте инструменты, необходимые для выполнения работы :
Если вы не можете синхронизировать потоки с простой блокировкой или атомарными операциями, подумайте об использовании WaitHandles. Если вы не можете синхронизировать потоки с WaitHandles, подумайте об использовании Wait и Pulse.