点点滴滴访问量:

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

    }

}
posted on 2008-03-18 13:03  sopper  阅读(1757)  评论(3编辑  收藏  举报