从不同的线程调用方法

时间:2017-10-26 19:42:59

标签: c# multithreading methods locking

我有4个窗体,它们使用另一种形式的方法。此方法必须仅由其中一个表单处理。如果某个线程想要使用此方法,则必须确保其他线程此时不会调用该方法。

我有这样的解决方案

bool methodIsBusy = false;

void Method()
{
     methodIsBusy = true;

     //do method things

     //done method things

     methodIsBusy = false;

}

并使用 methodIsBusy 来了解该方法是否被线程占用。对这个问题有更有创意的解决方案吗?谢谢。

3 个答案:

答案 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); }再次释放锁定对象。