AutoResetEvet 类里面的Set 方法
Set 方法在MSDN 说能够把该类的对象的状态设置为终止
然后让一个或多个等待的线程继续运行
但我不知道为什么不行
就只能让一个继续执行
class a
{
static AutoResetEvent myResetEvent = new AutoResetEvent(false);
public void F()
{
Console.WriteLine( "\n{0} is waiting for set ", Thread.CurrentThread.Name);
myResetEvent.WaitOne();
Console.WriteLine( "Accept! ");
}
public void EventSet()
{
Console.WriteLine( "Set! After 2 seconds ");
Thread.Sleep(2000);
myResetEvent.Set();
}
}
class b
{
static void Main()
{
a a = new a();
Thread newThread1 = new Thread(a.F);
newThread1.Name = "Thread1 ";
Thread newThread2 = new Thread(a.F);
newThread2.Name = "Thread2 ";
Thread newThread3 = new Thread(a.F);
newThread3.Name = "Thread3 ";
newThread1.Start();
newThread2.Start();
newThread3.Start();
Thread.Sleep(2000);
Console.WriteLine( "ThreadState : {0} {1} {2} ", newThread1.ThreadState,
newThread2.ThreadState,
newThread3.ThreadState);
Thread.Sleep(2000);
Thread set = new Thread(a.EventSet);
set.Start();
Thread.Sleep(4000);
Console.WriteLine( "ThreadState : {0} {1} {2} ",newThread1.ThreadState,
newThread2 .ThreadState,
newThread3.ThreadState);
}
}
[解决办法]
msdn中写道:
使用 AutoResetEvent 类可以使某个线程等待,直到某个事件通过调用 AutoResetEvent.Set 将其置于已发信号的状态为止。
与 ManualResetEvent 不同,AutoResetEvent 在单个等待线程被释放后
由系统自动重置为未发信号的状态。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果没有任何线程正在等待,则该事件对象的状态将保持已发信号的状态。
所以换成ManualResetEvent即可
[解决办法]
try..
a a = new a();
Thread newThread1 = new Thread(a.F);
newThread1.Name = "Thread1 ";
a b = new a();
Thread newThread2 = new Thread(b.F);
newThread2.Name = "Thread2 ";
a c = new a();
Thread newThread3 = new Thread(c.F);
newThread3.Name = "Thread3 ";
newThread1.Start();
newThread2.Start();
newThread3.Start();
Thread.Sleep(2000);
Console.WriteLine( "ThreadState : {0} {1} {2} ", newThread1.ThreadState,
newThread2.ThreadState,
newThread3.ThreadState);
Thread.Sleep(2000);
a.EventSet();
b.EventSet();
c.EventSet();
Thread.Sleep(4000);
Console.WriteLine( "ThreadState : {0} {1} {2} ", newThread1.ThreadState,
newThread2.ThreadState,
newThread3.ThreadState);