在一些多线程程序里,有些线程需要中途暂停。
一般我用一个布尔变量的判定来让一个循环执行空转或运行计算某些东西来达到中途暂停效果。
System.Threading命名空间下有个EventWaitHandle的类,能实现暂停继续的效果。
static EventWaitHandle eHandle=new EventWaitHandle(true, EventResetMode.AutoReset);
第一个参数 true 代表 eHandle处于终止状态 false则为非终止状态
第二个参数是一个枚举类型EventResetMode AutoReset是自动模式 ManualReset是手动模式
怎么用呢? 在自动模式下
程序:
static EventWaitHandle eHandle=new EventWaitHandle(true, EventResetMode.AutoReset);
xxx; 执行
eHandle.WaitOne(); 通过
xxx; 执行
eHandle.WaitOne(); 暂停
xxx;
static EventWaitHandle eHandle=new EventWaitHandle(false, EventResetMode.AutoReset);
xxx; 执行
eHandle.WaitOne(); 暂停
xxx;
第一个参数区别初始状态 true在终止状态下 遇到第一个WaitOne会直接通过,然后变为非终止状态,通过不了第二个,暂停在那里。
false为初始在非终止状态,遇到WaitOne,通过不了,直接暂停。
AutoReset模式就是没遇到一个WaitOne会自动切回非终止状态。
而ManulReset模式是不会自动切换状态的。
如何改变eHandle的状态呢?
eHandle.Set(); 切到终止状态
eHandle.Reset(); 切到非终止状态
eHandle就是一扇门,你定义它初始是开的还是关的, true是开的,false是关的。 还有它会不会自动关门,AutoReset自动、 ManuelReset非自动
遇到每个WaitOne()判别下,门开的就过,不开就等。 如果自动门是开的,一个WaitOne过去后,门自动关上。 手动门就一直开着。
我们自己通过Set()、Reset()控制门开关。