Thread系列之ManualResetEvent(三)

来源:互联网 发布:tourex 源码 编辑:程序博客网 时间:2024/05/18 03:01

 ManualResetEvent就像一个信号灯,可以利用它的信号,控制当前线程是挂起状态还是运行状态。
        它有几个常用的方法:Reset(),Set(),WaitOne();
        初始化该对象时,可以指定其默认的状态(有信号/无信号);
        在初始化以后,该对象将保持原来的状态不变,直到它的Reset()或者Set()方法被调用;
        Reset()方法将其设置为无信号状态,Set()方法将其设置为有信号状态;
        WaitOne()方法在无信号状态下,可以使当前线程挂起;注意这里说的是当前线程;
        直到调用了Set()方法,该线程才被激活。

        在多线程的代码里,可以使用一个ManualResetEvent对象来控制线程所有线程;
        只要在调用WaitOne()方法前,调用Reset()方法,因为WaitOne()控制的是当前线程;
        但是这样做,ManualResetEvent对象的管理逻辑会变得复杂;
        所以这里建议一条线程一个ManualResetEvent对象。
 

 using  System;
 
using  System.Collections.Generic;
 
using  System.Text;
 
using  System.Threading;
 
 
namespace  ConsoleThread
 
{
     
 class  ThreadClass
     
 {
         
 public   void  threadFun()
         
 {
             Thread.Sleep(
 1000 );
             Console.WriteLine(
 " ThreadClass.threadFun 1 " );
 
             
 // 激活被挂起的线程 
 
            Program.allDone.Set();
 
             Console.WriteLine(
 " ThreadClass.threadFun 2 " );
 
             
 // 设置为无信号,如果注释这条语句,
             
 // 下面的WaitOne()方法就不起做用了 
 
            Program.allDone.Reset();
 
             
 // 使当前线程挂起 
 
            Program.allDone.WaitOne();
 
             Console.WriteLine(
 " ThreadClass.threadFun 3 " );
 
         }
 

 
     }
 
;
     
 
 
     
 class  Program
     
 {
         
 public   static  ManualResetEvent allDone  =   new  ManualResetEvent( false );
         
 static   void  Main( string [] args)
         
 {
             Console.WriteLine(
 " Thread Start/Stop/Join Sample " );
             ThreadClass ThreadC 
 =   new  ThreadClass();
             Thread thread 
 =   new  Thread( new  ThreadStart(ThreadC.threadFun));
             thread.Start();
 
             
 // 挂起当前线程 
 
            allDone.WaitOne();
 
             Console.WriteLine(
 " Main 1 " );
 
             
 // 因为ThreadClass.threadFun方法里调用了Reset()
             
 // 所以这里的WaitOne()方法会使主线程也挂起
             
 // allDone.WaitOne();
 
             
 // 使主线程挂起1秒钟,
             
 // 为了ThreadClass.threadFun方法里的Program.allDone.WaitOne()方法
             
 // 运行时间在Main()方法的allDone.Set()方法前面 
 
            Thread.Sleep( 5000 );
 
             
 // 设置为有信号
             
 // 如果没有这条语句,ThreadClass.threadFun方法里最后一条语句就不会运行 
 
            allDone.Set();
             Console.WriteLine(
 " Main 2 " );
         }
 

     }
 

 }