急请求教线程相斥问题

zoujiaming 2009-09-17 04:05:06
我有两个线程,现在同访问一个方法,但我不想两个线程能够同时访问到这个方法


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();执行完成后再恢复线程,但发现计时变得不规律,差距很小但这不是我想要的。

谢谢~~
...全文
69 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
enihs 2009-09-18
  • 打赏
  • 举报
回复
信号量
yutian_01261027 2009-09-18
  • 打赏
  • 举报
回复
Object obj = new Object();
lock(obj)
{
//你的方法
}
zeroreal 2009-09-18
  • 打赏
  • 举报
回复
定义一个共享的变量,如Object obj;然后使用 lock(obj){}锁定这个变量,两个函数都锁定同一个变量,这样,一个函数在执行的时候,另一个函数会因为取不到锁定的变量而等待
zoujiaming 2009-09-18
  • 打赏
  • 举报
回复
up
wenbin 2009-09-18
  • 打赏
  • 举报
回复
开始时把信号置为未标记状态
ManualResetEvent.ReSet();
ManualResetEvent.WaitOne();
当然这里你还可以处理超时问题
你的方法
休眠1秒,(你所要求的)
ManualResetEvent.Set();
zoujiaming 2009-09-18
  • 打赏
  • 举报
回复
to zeroreal,yutian_01261027

我前面已经说了,lock不行
zoujiaming 2009-09-17
  • 打赏
  • 举报
回复
to gisyellow

能就我的实例具体说说么?谢谢~
gisyellow 2009-09-17
  • 打赏
  • 举报
回复
用ManualResetEvent类和WaitHandle。。
zoujiaming 2009-09-17
  • 打赏
  • 举报
回复
to zgke

private void Loop()
{
while(true)
{
lock(obj)
{
RotationCommand("Stop");
Thread.Sleep(3000);
RotationCommand("Run");
Thread.Sleep(5000);
}

}
}

这样试过了,不行的
zoujiaming 2009-09-17
  • 打赏
  • 举报
回复
我要求TimeControllor();访问后有足够1秒的时间后TimeControllor2();才可以继续访问
zgke 2009-09-17
  • 打赏
  • 举报
回复
lock(object)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧