我有4个窗体,它们使用另一种形式的方法。此方法必须仅由其中一个表单处理。如果某个线程想要使用此方法,则必须确保其他线程此时不会调用该方法。
我有这样的解决方案
bool methodIsBusy = false;
void Method()
{
methodIsBusy = true;
//do method things
//done method things
methodIsBusy = false;
}
并使用 methodIsBusy 来了解该方法是否被线程占用。对这个问题有更有创意的解决方案吗?谢谢。
答案 0 :(得分:4)
最简单的传统模式更像是这样,使用lock
。锁内部的代码(称为critical section)一次只能由一个线程执行。
object lockObject = new object(); //Can be anything, an object will do
void Method()
{
lock (lockObject)
{
//do method things
//done method things
}
}
理论上你可以使用bool
,但你必须编写busywait代码,如下所示:
//Don't do this!
while (methodIsBusy)
{
System.Threading.Thread.Sleep(10); //or some number
}
这种代码最终会使用比锁定更多的资源,而锁定就是为了这个目的而设计的。
答案 1 :(得分:0)
您可以使用lock
来确保只有一个线程可以输入使用lock
语句封装的关键块。
答案 2 :(得分:-1)
还可以查看Monitor.TryEnter - 它可以让你测试你是否可以进入,而不是锁定并且没有做出任何事情。只需确保使用try {} finalley { Monitor.Exit(obj); }
再次释放锁定对象。