我有两个线程,现在同访问一个方法,但我不想两个线程能够同时访问到这个方法
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();执行完成后再恢复线程,但发现计时变得不规律,差距很小但这不是我想要的。谢谢~~
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();执行完成后再恢复线程,但发现计时变得不规律,差距很小但这不是我想要的。谢谢~~
{
while(true)
{
lock(obj)
{
RotationCommand("Stop");
Thread.Sleep(3000);
RotationCommand("Run");
Thread.Sleep(5000);
} }
} 这样试过了,不行的
lock(obj)
{
//你的方法
}
ManualResetEvent.ReSet();
ManualResetEvent.WaitOne();
当然这里你还可以处理超时问题
你的方法
休眠1秒,(你所要求的)
ManualResetEvent.Set();