У меня самого было то же самое сомнение, и, несмотря на некоторые интересные ответы (некоторые из них присутствуют здесь), я все еще продолжал искать более убедительный ответ.
Я думаю, что интересная и простая мысль по этому вопросу могла быbe: я могу вызвать Monitor.Wait (lockObj) в определенный момент, когда никакой другой поток не ожидает получения блокировки на объекте lockObj .Я просто хочу дождаться, когда что-то произойдет (например, состояние какого-то объекта изменится), что, как я знаю, произойдет в конечном итоге в каком-то другом потоке.Как только это условие будет выполнено, я хочу иметь возможность повторно получить блокировку, как только другой поток снимет ее блокировку.
По определению метода Monitor.Wait онснимает блокировку и пытается снова ее получить.Если он не дождался вызова метода Monitor.Pulse , прежде чем пытаться снова получить блокировку, он просто снял бы блокировку и немедленно получил ее снова (в зависимости от вашего кода, возможно, в цикле).
То есть мне кажется интересным пытаться понять необходимость метода Monitor.Pulse , взглянув на его полезность в функционировании Monitor.Wait .Метод.
Подумайте так: «Я не хочу снимать эту блокировку и сразу же попытаться получить ее снова, потому что Я НЕ ХОЧУ быть МЕНЯ следующим потоком, чтобы получить эту блокировку. И я такжене хочу оставаться в цикле, содержащем вызов Thread.Sleep , проверяющий некоторый флаг или что-то еще, чтобы узнать, когда условие, которого я жду, было достигнуто, чтобы я мог попытаться повторно получитьблокировка. Я просто хочу «впасть в спячку» и автоматически пробудиться, как только кто-то скажет мне, что условие, которого я жду, достигнуто. ".