private ManualResetEvent ManualSet= new ManualResetEvent(true);
private bool blnExitLoop = false;//从Start启动一个线程
Start()
{
Thread ThDo = new Thread(new ThreadStart(LoopRun));
ThDo.SetApartmentState(ApartmentState.STA);
ManualSet.WaitOne();
ManualSet.Reset(); ThDo.Start();
}//循环执行方法A ,方法B
void LoopRun()
{
While(true)
{
//方法A
A();
//方法B
B(); if(blnExitLoop== true) break;
}
ManualSet.Set();
}//停止循环
void Stop()
{
blnExitLoop = true; //用于跳出循环的变量
//在这里等待信号返回,从而继续下面的操作
ManualSet.WaitOne();
//........
}先是C# winform前台,启动方法Start();系统前台界面调用stop()方法停止循环操作时,但是在等待信号的时候,stop()方法中,ManualSet.WaitOne()迟迟等不到信号。
跟踪下去,发现在方法A()中设置断点,程序在A()中竟然走不出来了,不知问什么,好像里面进行着死循环似地。但是A()中,没有进行复杂的代码,更没循环操作。所以导致循环好像卡住了。请教各个大虾!!!
private bool blnExitLoop = false;//从Start启动一个线程
Start()
{
Thread ThDo = new Thread(new ThreadStart(LoopRun));
ThDo.SetApartmentState(ApartmentState.STA);
ManualSet.WaitOne();
ManualSet.Reset(); ThDo.Start();
}//循环执行方法A ,方法B
void LoopRun()
{
While(true)
{
//方法A
A();
//方法B
B(); if(blnExitLoop== true) break;
}
ManualSet.Set();
}//停止循环
void Stop()
{
blnExitLoop = true; //用于跳出循环的变量
//在这里等待信号返回,从而继续下面的操作
ManualSet.WaitOne();
//........
}先是C# winform前台,启动方法Start();系统前台界面调用stop()方法停止循环操作时,但是在等待信号的时候,stop()方法中,ManualSet.WaitOne()迟迟等不到信号。
跟踪下去,发现在方法A()中设置断点,程序在A()中竟然走不出来了,不知问什么,好像里面进行着死循环似地。但是A()中,没有进行复杂的代码,更没循环操作。所以导致循环好像卡住了。请教各个大虾!!!
有时候出现,有时候正常。
再说,这种操作是在后台循环执行一个命令,动作是循环操作,
不把循环放在线程,放哪比较合适呢???
ManualSet.WaitOne();
ManualSet.Reset();
private bool bLoop = true; //从Start启动一个线程
Start()
{
Thread ThDo = new Thread(new ThreadStart(LoopRun));
ThDo.SetApartmentState(ApartmentState.STA);
ThDo.Start();
} //循环执行方法A ,方法B
void LoopRun()
{
While(bLoop)
{
ManualSet.WaitOne();
if(OK)
{
GOGO!
}
else
ManualSet.Reset();
}
} //停止循环
void Stop()
{
bLoop = false; //用于跳出循环的变量
if(ThDo != null && ThDo.islive)
{
try{ThDo.about();}
catch(System.Threading.ThreadAbortException){}
}
} void IWantToDoSomething()
{
.....
.....
ManualSet.set();
}
方法A
void A()
{
//通过串口,调用第三方的一些接口,读取数据
//...
//一些计算公式,计算这些数据
//...
//数据库的一些操作,存储数据
//...
//跳出方法
}所有的上面操作应该是正常的,能够顺利执行。
线程主塞是 ManualSet.WaitOne();
你在门外叫停、当然没用、
LoopRun() 还是会跑的乱七八糟的
请问
if(OK)
{
GOGO!
}
else
ManualSet.Reset(); 这个逻辑是什么。有点费解
动作
else
ManualSet.Reset(); //暂停线程
我知道这关键词的意义,我说的意思是在本程序中,行不通
void LoopRun()
{
While(bLoop)
{
ManualSet.WaitOne();
if(条件)
{
动作
}
else
ManualSet.Reset();
}
}
一开始会在ManualSet.WaitOne();阻塞
而且上面所说的“条件”是指什么。
我要执行的是方法A,方法B。
{
queueXXX.Enqueue(x);
ManualSet.set();
}void LoopRun()
{
While(bLoop)
{
ManualSet.WaitOne();
if(queueXXX.count >0)
{
XXX x= queueXXX.Dequeue();
}
else
ManualSet.Reset();
}
}
private bool blnExitLoop = false; Start()
{
Thread ThDo = new Thread(new ThreadStart(LoopRun));
ThDo.SetApartmentState(ApartmentState.STA); ThDo.Start();
ManualSet.WaitOne();
ManualSet.Reset();
} void LoopRun()
{
Thread.Sleep(5000);
ManualSet.Set();
}