Когда мне следует использовать wathandle вместо замка
-
27-10-2019 - |
Вопрос
В C#
, когда мы должны использовать WaitHandle
вместо lock
?
Решение
Замок принципиально отличается от WaitHandle
. Анкет Например, с заблокированной блокировкой:
lock (SomeResource)
{
// do stuff here
}
В первой строке говорится: «Я хочу эксклюзивный доступ к этому ресурсу», и буду ждать, пока этот ресурс не будет доступен (т.е. ни у кого нет блокировки). Затем код запускается, и в конце блокировка выпускается так, чтобы другие могли его использовать.
WaitHandle
используется, чтобы ждать какого -то мероприятия. Когда вы пишете:
MyWaitHandle.WaitOne();
Ваш код ждет какого -то другого потока (возможно, в другом процессе), чтобы сигнализировать о том, что WaitHandle
. Анкет То, что он сигнализирует, может быть чем угодно. Возможно, вы ждете еще одного ветка, чтобы закончить свою работу, и скажет: «Я закончил», прежде чем ваш код продолжится.
Таким образом, чтобы ответить на ваш вопрос, вы должны использовать блокировку, когда хотите получить эксклюзивный доступ к ресурсу. Вы должны использовать WaitHandle
Когда вы хотите получить уведомление о каком -то событии.
Другие советы
Уэйт -ручка может ждать нескольких ручек, замок может ждать только одного.
Когда вам это нужно. Серьезно, блокировка - это синтаксический сахар с Monitor
, который, вероятно, использует WaitHandles внутри.
Используйте его только в том случае, если вам нужна большая гибкость (например, удерживание за блокировкой дольше, чем текущая область ...) или управлять несколькими блокировками в правильном порядке и т. Д.
Они выполняют совершенно разные вещи. А lock
используется для ограничения доступа к определенному блоку кода к не замужем нить за раз. А WaitHandle
является базовым классом для нескольких классов, связанных с параллелизмом, таких как Semaphore
, Mutex
, AutoResetEvent
, а также ManualResetEvent
, что позволяет вам контролировать параллелизм немного по -разному. Например, Semaphore
позволяет ограничить параллелизм не более чем Не потоки вместо одного потока.
WaitHandle
часто используется, когда у вас есть несколько потоков, и вы хотите ждать, пока один или все из них завершит, прежде чем продолжить какое -то другое действие. lock
будет использован, если вы хотите предотвратить одновременно несколько потоков в общий ресурс.
Лучшее объяснение заключается в этих двух ссылках. К сожалению, вам придется прочитать, чтобы получить полный ответ на тот тип вопроса, который вы задали:
Это также содержит пример:http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx