首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

AutoResetEvet 类里面的Set 方法,该如何解决

2012-01-19 
AutoResetEvet 类里面的Set 方法Set方法在MSDN说能够把该类的对象的状态设置为终止然后让一个或多个等待的

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);

热点排行