我在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
}