Когда я должен использовать WaitHandle вместо блокировки - PullRequest
2 голосов
/ 29 апреля 2011

В C#, когда мы должны использовать WaitHandle вместо lock?

Ответы [ 6 ]

4 голосов
/ 29 апреля 2011

Замок принципиально отличается от WaitHandle.С блокировкой вы пишете, например:

lock (SomeResource)
{
    // do stuff here
}

Первая строка говорит: «Я хочу эксклюзивный доступ к этому ресурсу» и будет ждать, пока этот ресурс не станет доступным (т. Е. Никто другой не имеет блокировки на нем).Затем код запускается, и в конце блокировка снимается, чтобы другие могли ее использовать.

WaitHandle используется для ожидания какого-либо события.Когда вы пишете:

MyWaitHandle.WaitOne();

Ваш код ожидает, пока какой-то другой поток (возможно, в другом процессе) сообщит, что WaitHandle.То, что он сигнализирует, может быть чем угодно.Возможно, вы ожидаете, пока другой поток завершит свою работу и скажет: «Я закончил», прежде чем ваш код сможет продолжить работу.

Итак, чтобы ответить на ваш вопрос, вы должны использовать блокировку, когда захотитеполучить эксклюзивный доступ к ресурсу.Вы должны использовать WaitHandle, если хотите получать уведомления о каком-либо событии.

2 голосов
/ 29 апреля 2011

Они совершают совершенно разные вещи.lock используется для ограничения доступа к определенному блоку кода для одного потока одновременно.A WaitHandle - это базовый класс для нескольких классов, связанных с параллелизмом, таких как Semaphore, Mutex, AutoResetEvent и ManualResetEvent, которые позволяют вам управлять параллелизмом немного другими способами.Например, Semaphore позволяет ограничить параллелизм не более чем N потоков вместо одного потока.

2 голосов
/ 29 апреля 2011

Когда вам это нужно.Серьезно, блокировка - это синтаксический сахар с Monitor, который, вероятно, использует WaitHandles для внутреннего использования.

Используйте его только в том случае, если вам нужна большая гибкость (например, удержание блокировки дольше текущей области ...) или управлениенесколько замков в правильном порядке и т. д.

2 голосов
/ 29 апреля 2011

WaitHandle может ожидать несколько дескрипторов, блокировка может ожидать только один.

1 голос
/ 29 апреля 2011

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

0 голосов
/ 29 апреля 2011

Лучшее объяснение лежит в этих двух ссылках. К сожалению, вам придется немного почитать, чтобы получить полный ответ на вопрос, который вы задали:

Это также содержит пример: http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx

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

...