Либо используйте это:
Monitor.Enter(_lock)
try
{
// do work
}
finally
{
Monitor.Exit(_lock);
}
или - более предпочтительно - ключевое слово lock
:
lock(_lock)
{
// do work
}
Фактически, эти фрагменты кода будут генерировать один и тот же код. Компилятор переведет второй код в первый. Однако второй вариант предпочтительнее, потому что он гораздо более читабелен.
UPDATE:
Блокировка принадлежит потоку, в котором она была получена. Это означает, что возможно использование вложенного оператора lock
:
void MethodA()
{
lock(_lock)
{
// ...
MethodB();
}
}
void MethodB()
{
lock(_lock)
{
// ...
}
}
Приведенный выше код не будет блокироваться.