Когда мне следует использовать wathandle вместо замка

StackOverflow https://stackoverflow.com/questions/5832757

  •  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

http://msdn.microsoft.com/en-us/library/kad9xah9.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top