我有两个线程,现在同访问一个方法,但我不想两个线程能够同时访问到这个方法
private void TimeControllor()
        {
            Runner = new Thread(new ParameterizedThreadStart(RotationLoop));
            Runner.IsBackground = true;
            Runner.Start();
        }private void Loop()
        {
            while(true)
            {
                RotationCommand("Stop");
                Thread.Sleep(3000);
                RotationCommand("Run");
                Thread.Sleep(5000);            }
        }
private void RotationCommand(string Behavie)
{
          //...............
}
private void TimeControllor2()
        {
            Runner2 = new Thread(new ParameterizedThreadStart(Loop2));
            Runner2.IsBackground = true;
            Runner2.Start();
        }private void Loop2()
        {
            while(true)
            {
                RotationCommand("NoRun");
               Thread.Sleep(1000);
            }
        }
void Main()
{
    //实际这两个方法的调用在程序的不同位置,暂写在一起
TimeControllor2();
    TimeControllor();
    
}
我需要TimeControllor();在执行时,TimeControllor2();能够等待TimeControllor();执行完成,再继续执行TimeControllor2();。因为我这两个线程都用来计时,所以同时需要。我现在遇到的问题是,两个线程有时会同步,同时去访问RotationCommand方法,这是我不希望看到的。任何方法都可以,只要保证两个线程不要同步执行就好。PS:我自己做过了委托,试图暂停TimeControllor2();的线程,当TimeControllor();执行完成后再恢复线程,但发现计时变得不规律,差距很小但这不是我想要的。谢谢~~

解决方案 »

  1.   

    我要求TimeControllor();访问后有足够1秒的时间后TimeControllor2();才可以继续访问
      

  2.   

    to zgkeprivate void Loop() 
            { 
                while(true) 
                { 
                    lock(obj)
                     {
                    RotationCommand("Stop"); 
                    Thread.Sleep(3000); 
                    RotationCommand("Run"); 
                    Thread.Sleep(5000); 
                     }            } 
            } 这样试过了,不行的
      

  3.   

    用ManualResetEvent类和WaitHandle。。
      

  4.   

    to gisyellow 能就我的实例具体说说么?谢谢~
      

  5.   

    定义一个共享的变量,如Object obj;然后使用 lock(obj){}锁定这个变量,两个函数都锁定同一个变量,这样,一个函数在执行的时候,另一个函数会因为取不到锁定的变量而等待
      

  6.   

    Object obj = new Object();
    lock(obj)
    {
       //你的方法
    }
      

  7.   

    to zeroreal,yutian_01261027我前面已经说了,lock不行
      

  8.   

    开始时把信号置为未标记状态
    ManualResetEvent.ReSet();
    ManualResetEvent.WaitOne();
    当然这里你还可以处理超时问题
    你的方法
    休眠1秒,(你所要求的)
    ManualResetEvent.Set();