Меня беспокоит то, что если вы вызываете Reset () до WaitOne (), у вас проблемы, если Set () никогда не вызывается. Это может произойти, если вы вызовете Set (), а затем сразу же нажмете Reset (), прежде чем нажать WaitOne (). Даже если вы вызываете Set () дважды, нет гарантии, что вы не вызовете Reset () после обоих, блокируя поток без механизма освобождения.
В идеале вы должны иметь блок try..catch..finally и вызывать Set () в блоке finally, а ваша обработка исключений не будет распределена по методам. Это работает для вас?
Ганс прав, что в этом сценарии многопоточность не нужна. Мои опасения применимы, только если вы действительно многопоточны со своими вызовами WaitOne ().
Меня также беспокоит, что вы вызываете набор более одного раза ... означает ли это, что при вызове первого набора ресурс действительно должен оставаться заблокированным? Если вы все еще можете нажать Set () во второй раз, для меня это говорит о том, что вы все еще выполняете код, который работает с общими ресурсами. В этом случае вы не хотите, чтобы вызов WaitOne () разблокировался.
Также обратите внимание, из MSDN:
Нет никакой гарантии, что каждый вызов метода Set освободит поток. Если два вызова находятся слишком близко друг к другу, так что второй вызов происходит до освобождения потока, освобождается только один поток. Как будто второго звонка не произошло.
В любом случае кажется, что ваш код должен либо идти по пути выдачи исключения, либо выполняться до завершения, но не оба. И.Е. Вы не должны вызывать Set () дважды.