Ответ 1
ManualResetEvent
и ManualResetEventSlim
оба предназначены так, чтобы они оставались сигналами после вызова. Обычно это имеет совсем другой сценарий, чем AutoResetEvent
.
AutoResetEvent
немедленно возвращается в состояние unsignaled после использования, которое обычно используется для другого набора сценариев. Из документации AutoResetEvents:
Как правило, вы используете этот класс, когда потоки нуждаются в эксклюзивном доступе к ресурсу.
ManualResetEvent
(и Slim
) обычно используются, однако, для сценария, в котором:
это сообщение относится к задаче, которую должен выполнить один поток, прежде чем другие потоки могут продолжить.
Так как AutoResetEvent
чаще всего используется в сценариях, где есть несколько потоков, совместно использующих ресурс, времена ожидания обычно не будут чрезвычайно короткими. ManualResetEventSlim
, однако, действительно предназначен только тогда, когда вы заранее знаете, что время ожидания очень короткое. Если ваше время ожидания не будет очень коротким, тогда вы должны использовать ManualResetEvent
. Подробнее см. Документацию по разнице между MRE и MRES.
Когда время ожидания больше (это будет обычный сценарий с AutoResetEvent
), "тонкая" версия на самом деле хуже, поскольку она возвращается к использованию дескриптора ожидания.