Ручная блокировка / разблокировка C #

У меня есть функция на C #, которую можно вызывать несколько раз из нескольких потоков, и я хочу, чтобы это выполнялось только один раз, поэтому я подумал об этом:

class MyClass
{
    bool done = false;
    public void DoSomething()
    {
        lock(this)
            if(!done)
            {
                done = true;
                _DoSomething();
            }
    }
}

Проблема в _DoSomething занимает много времени, и я не хочу, чтобы многие потоки ждали его, когда они просто увидят, что done истинно.
Обходной путь может быть что-то вроде этого:

class MyClass
{
    bool done = false;
    public void DoSomething()
    {
        bool doIt = false;
        lock(this)
            if(!done)
                doIt = done = true;
        if(doIt)
             _DoSomething();
    }
}

Но просто выполнить блокировку и разблокировку вручную будет намного лучше.
Как я могу вручную заблокировать и разблокировать, как это делает блокировка (объект) ? Мне нужно, чтобы он использовал тот же интерфейс, что и lock , чтобы этот ручной способ и lock блокировали друг друга (для более сложных случаев).

22
задан Dani 28 April 2011 в 12:08
поделиться