Начать и закончить блокировку разными способами - PullRequest
7 голосов
/ 31 мая 2011

Я бы хотел - по непонятным причинам не задавать вопросов - запустить блокировку в одном методе и завершить ее в другом. Как-то так:

object mutex = new object();

void Main(string[] args)
{
    lock (mutex)
    {
        doThings();
    }
}

будет иметь такое же поведение, как:

object mutex = new object();

void Main(string[] args)
{
    Foo();
    doThings();
    Bar();
}

void Foo()
{
    startLock(mutex);
}

void Bar()
{
    endlock(mutex);
}

Проблема в том, что ключевое слово lock работает в синтаксисе блока, конечно. Я знаю, что замки не предназначены для такого использования, но я более чем открыт для творческих и хакерских решений S / O. :)

1 Ответ

16 голосов
/ 31 мая 2011
private readonly object syncRoot = new object();

void Main(string[] args)
{
    Foo();
    doThings();
    Bar();
}

void Foo()
{
    Monitor.Enter(syncRoot);
}

void Bar()
{
    Monitor.Exit(syncRoot);
}

[ Редактировать ]

Когда вы используете lock, это то, что происходит под капотом в .NET 4:

bool lockTaken = false;
try
{
    Monitor.Enter(syncRoot, ref lockTaken);

    // code inside of lock
}
finally
{
    if (lockTaken)
        Monitor.Exit(_myObject);
}    
...