我在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(object)一样手动锁定和解锁?我需要它使用与lock相同的接口(interface),以便这种手动方式和lock可以相互阻止(对于更复杂的情况)。

最佳答案

lock关键字只是Monitor.Enter和Monitor.Exit的语法糖:

Monitor.Enter(o);
try
{
    //put your code here
}
finally
{
    Monitor.Exit(o);
}

是相同的
lock(o)
{
    //put your code here
}

10-06 08:46
查看更多