Синхронизация потоков C # - PullRequest
2 голосов
/ 24 августа 2011

Мне нужно использовать объект блокировки, но он уже используется другим потоком. Я хочу подождать, пока объект блокировки будет свободен, но не знаю, как это сделать.

Я нашел что-то вроде:

if(Monitor.TryEnter(_lock)
{
try
{
    // do work
}
finally
{
    Monitor.Exit(_lock);
}

}

Но я просто проверяю и продолжаю, но я хочу подождать, пока объект блокировки не освободится.

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

Либо используйте это:

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)
    {
        // ...
    }
}

Приведенный выше код не будет блокироваться.

0 голосов
/ 24 августа 2011

Я согласен с @Daniel Hilgarth, синтаксис lock предпочтителен.

По вашему вопросу:

Я хочу подождать, пока объект блокировки будет свободен, но не знаю, как это сделать.

Согласно MSDN description :

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

т. Е. Код, который у вас уже есть, выполняет то, что вы хотите.

0 голосов
/ 24 августа 2011

Вы можете использовать Monitor.Enter

Из документов:

Используйте Enter, чтобы получить Монитор на объекте, переданном как параметр. Если другой поток выполнил Enter на объекте, но еще не выполнил соответствующий выход, текущий поток будет блокировать, пока другой поток не освободит объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...