У меня сложилось впечатление, что после чтения этой статьи лучше использовать Monitor/Lock для синхронизации потоков, поскольку он не использует собственные ресурсы
Конкретная цитата (со страницы 5 статьи):
Monitor.Wait/Pulse - это не единственный способ ждать, когда что-то произойдет в одном потоке и сообщит, что поток, который он произошел в другом. Программисты Win32 долгое время используют различные другие механизмы, и их открывают классы AutoResetEvent, ManualResetEvent и Mutex, все из которых происходят из WaitHandle. Все эти классы находятся в пространстве имен System.Threading. (Механизм Win32 Semaphore не имеет управляемой оболочки в .NET 1.1. Он присутствует в .NET 2.0, но если вам нужно использовать его до этого момента, вы можете либо обернуть его самостоятельно, используя P/Invoke, либо написать собственный счетный семафор класс.)
Некоторые люди могут быть удивлены, узнав, что использование этих классов может быть значительно медленнее, чем использование различных методов Monitor. Я считаю, что это происходит потому, что "выход" управляемого кода в собственные вызовы Win32 и обратно "в" снова дорогой по сравнению с полностью управляемым видом того, что предоставляет Monitor. Читатель также пояснил, что мониторы реализованы в пользовательском режиме, тогда как использование команд ожидания требует переключения в режим ядра, что довольно дорого.
Но, обнаружив SO и прочитав несколько вопросов/ответов, я начал сомневаться в своем понимании того, когда использовать их. Похоже, что многие люди рекомендуют использовать Auto/ManualResetEvent в случаях, когда будет выполняться Monitor.Wait/Pulse. Может ли кто-нибудь объяснить мне, когда синхронизация на основе WaitHandle должна использоваться для мониторинга?
Спасибо