相关疑难解决方法(0)

C#手动锁定/解锁

我在C#中有一个函数,可以从多个线程多次调用,我希望它只能完成一次,所以我想到了这个:

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

问题是_DoSomething需要很长时间,我不希望很多线程等待它,只要他们可以看到这done是真的.
这样的事情可以解决方法:

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

但只需手动锁定和解锁就会好得多.
我怎样才能手动锁定和解锁lock(object)?我需要它使用相同的接口,lock因此这种手动方式lock将相互阻塞(对于更复杂的情况).

c# multithreading locking

22
推荐指数
2
解决办法
3万
查看次数

标签 统计

c# ×1

locking ×1

multithreading ×1