Разница между синхронизацией и ожиданием - PullRequest
3 голосов
/ 08 сентября 2011

Я использовал официанта, управляемого потоком.

SyncLock http://msdn.microsoft.com/en-us/library/3a86s51t%28v=vs.71%29.aspx

Но теперь я хотел получить тайм-аут и нашел WaitOne.

WaitOne http://msdn.microsoft.com/en-us/library/system.threading.waithandle.waitone.aspx, который поддерживает простой тайм-аут.

Но он больше не работает.Может случиться так, что ошибка где-то еще в коде.Мой главный вопрос к вам: есть ли разница между использованием SyncLock и WaitOne в качестве основного флага официанта?

С уважением

Ответы [ 2 ]

4 голосов
/ 08 сентября 2011

SyncLock - это языковая оболочка для Monitor.Enter и Monitor.Exit.Он предназначен для одновременного ограничения доступа к критическому разделу кода или ресурса.

WaitHandle.WaitOne - это метод, предназначенный для использования в сценариях, где поток должен ожидать внешнего сигнала.Точная реализация и семантика того, как это работает, зависит от класса.Другими словами, WaitOne будет вести себя по-разному при использовании с AutoResetEvent по сравнению с ManualResetEvent или Semaphore.

Оба действительно предназначены для разных вариантов использования.Без лучшего описания вашей конкретной проблемы трудно даже предположить, какой из них лучше всего использовать.

Однако, если вы точно знаете, что хотите семантику блокировки (через SyncLock или Monitor class), тогда вы можете использовать Monitor.TryEnter, который предоставляет параметр тайм-аута.

2 голосов
/ 08 сентября 2011

Из MSDN http://msdn.microsoft.com/en-us/library/ms173179.aspx

Использование блокировки или монитора полезно для предотвращения одновременного выполнения чувствительных к потокам блоков кода, но эти конструкции не позволяют одному потоку передавать событие надругой.Это требует событий синхронизации, которые являются объектами, которые имеют одно из двух состояний, сигнализируемых и не сигнализируемых, которые можно использовать для активации и приостановки потоков.Потоки можно приостановить, заставив их ждать события синхронизации, которое не было сигнализировано, и его можно активировать, изменив состояние события на сигнальное.Если поток пытается ожидать события, о котором уже было сообщено, поток продолжает выполняться без задержки.

Существует два вида событий синхронизации: AutoResetEvent и ManualResetEvent.Они отличаются только тем, что AutoResetEvent изменяется с сигнального на не сигнализированный автоматически каждый раз, когда активирует поток.И наоборот, ManualResetEvent позволяет активировать любое количество потоков по своему сигнальному состоянию и будет возвращаться в состояние без сигнала только при вызове его метода Reset.

Потоки можно ожидать в событиях, вызывая один изметоды ожидания, такие как WaitOne, WaitAny или WaitAll.WaitHandle.WaitOne () заставляет поток ждать, пока одно событие не станет сигнализированным, WaitHandle.WaitAny () блокирует поток, пока одно или несколько указанных событий не станут сигнальными, и WaitHandle.WaitAll () заблокирует поток, пока все указанные события не станутсигнализировал.Событие становится сигнальным, когда вызывается его метод Set.

...