ManualResetEvent使用

1.定义

  MSDN定义:

    通知一个或多个正在等待的线程已发生事件。此类不能被继承。

  详细说明:

    ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

2.使用说明

  2.1初始化一个ManualResetEvent对象,例如:

   

ManualResetEvent manual = new ManualResetEvent(true);//初始化时设置对象为终止状态,在使用等待之前要用Reset()改变对象为非终止状态

ManualResetEvent manual = new ManualResetEvent(false);//初始化时为非终止状态

2.2设置超时等待

  第一种:永远等待下去直到收到继续进行的信号为止。

  

  manual.WaitOne()//永远等待直到收到继续信号为止

  第二种:设置等待的超时时间,超时以后WaitOne返回一直未False,未超时返回true

manual.WaitOne(new TimeSpan(0,0,5));//设置等待超时的时间,

2.3ManualResetEvent类的结构以及主要方法和属性的说明

                                                                                   

      类常用方法说明:

    

名称

说明

Close()

释放由当前 WaitHandle 占用的所有资源。

WaitAll(WaitHandle[])

等待指定数组中的所有元素都收到信号。

WaitAll(WaitHandle[], Int32)

 

等待指定数组中的所有元素接收信号,同时使用 Int32 值指定时间间隔。

WaitAll(WaitHandle[], Int32, Boolean)

等待指定数组中的所有元素收到信号,使用 Int32 值指定时间间隔,并指定是否在等待之前退出同步域。

WaitAll(WaitHandle[], TimeSpan)

等待指定数组中的所有元素接收信号,同时使用 TimeSpan 值指定时间间隔。

WaitAll(WaitHandle[], TimeSpan, Boolean)

等待指定数组中的所有元素收到信号,使用 TimeSpan 值指定时间间隔,并指定是否在等待之前退出同步域。

WaitAny(WaitHandle[])

等待指定数组中的任一元素收到信号。

WaitAny(WaitHandle[], Int32)

等待指定数组中的任意元素接收信号,同时使用 32 位有符号整数指定时间间隔。

WaitAny(WaitHandle[], Int32, Boolean)

等待指定数组中的任一元素收到信号,使用 32 位带符号整数指定时间间隔并指定是否在等待之前退出同步域。

WaitAny(WaitHandle[], TimeSpan)

等待指定数组中的任意元素接收信号,同时使用 TimeSpan 指定时间间隔。

WaitAny(WaitHandle[], TimeSpan, Boolean)

 

等待指定数组中的任一元素收到信号,使用 TimeSpan 指定时间间隔并指定是否在等待之前退出同步域。

WaitOne()

阻止当前线程,直到当前 WaitHandle 收到信号。

WaitOne(Int32)

阻止当前线程,直到当前 WaitHandle 收到信号,同时使用 32 位带符号整数指定时间间隔(以毫秒为单位)。

WaitOne(Int32, Boolean)

阻止当前线程,直到当前的 WaitHandle 收到信号为止,同时使用 32 位带符号整数指定时间间隔,并指定是否在等待之前退出同步域。

WaitOne(TimeSpan)

阻止当前线程,直到当前实例收到信号,同时使用 TimeSpan 指定时间间隔。

WaitOne(TimeSpan, Boolean)

阻止当前线程,直到当前实例收到信号为止,同时使用 TimeSpan 指定时间间隔,并指定是否在等待之前退出同步域。

 

3.示例代码说明

  

        static void trmain()
        {
            Thread tr = Thread.CurrentThread;
            Console.WriteLine("thread:wait for an event");
          
           isTimeout =  manual.WaitOne(new TimeSpan(0,0,5));
            Console.WriteLine("thread : go an event ");
            
        }


        private static bool isTimeout;
        private static Stopwatch watch;  
        private static System.Threading.Timer timer;
        static ManualResetEvent manual = new ManualResetEvent(true);
      
       
        public static void Main()
        {
            watch = new Stopwatch();
           
            Timeout timeout = new Timeout();
            watch.Start();
            manual.Reset();
            timer = new System.Threading.Timer((obj)=> { Console.WriteLine(string.Format("运行时间:{0}秒 当前等待结果:{1}", watch.Elapsed.TotalSeconds.ToString("F2"),isTimeout)); }, null, 0, 500);

            Thread thread = new Thread(new ThreadStart(trmain));
            thread.Name = "线程名称";

            thread.Start();
            System.Threading.Thread.Sleep(4000);
            manual.Set();
        
            Console.WriteLine("*************************************");

           
         
            Console.Read();
            watch.Stop();
            timer.Dispose();

        }

测试结果截图:

                          

转载于:https://www.cnblogs.com/wangjunqiao/p/5533190.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值