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

        }

测试结果截图:

                          

时间: 2024-10-26 22:51:21

ManualResetEvent使用的相关文章

AutoResetEvent和ManualResetEvent理解

AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandleAPI类似,使用中还是有区别的. 之前每次需要使用的时候,都去找他们之间的区别.虽然当时是明白了,但没有深入理解透彻,过几天又忘记了.等到下次需要使用的时候又要重新去理解这2个类. 今天再次遇到他们,写下这篇随笔..加深理解印象.到了下次再用到不用再去纠结区别了. 1.构造函数参数 var manualResetEventWaitHandle = new ManualRe

WaitHandle——使用ManualResetEvent

信号量机制 使用ManualResetEvent和AutoResetEvent都继承自EventWaitHandle(继承自waitHandle).EventWaitHandle对象有两个状态:收到信号(signaled)和未收到信号(nonsignaled):EventWaitHandle中的set和reset方法分别用于将eventwaitHandle对象的状态设为收到信号和未收到信号. 当EventWaitHandle未收到信号时,任何线程调用基类的wait方法都会被阻塞,知道eventh

C# 使用ManualResetEvent 进行线程同步

上一篇我们介绍了AutoResetEvent,这一篇我们来看下ManualResetEvent ,顾名思义ManualResetEvent  为手动重置事件. AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别. Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送.可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态.如果某个线程调用WaitOne方法,则

ManualResetEvent

线程是程序中的控制流程的封装.你可能已经习惯于写单线程程序,也就是,程序在它们的代码中一次只在一条路中执行.如果你多弄几个线程的话,代码运行可能 会更加“同步”. 在一个有着多线程的典型进程中,零个或更多线程在同时运行.但是,在有着N个CPU的机器上,一个线程只能在给定的时间上在一个CPU上 运行,因为每个线程都是一个代码段,每个CPU一次只能运行一段代码.而看起来像是N个同时完成是线程间共享CPU时间片的效果. 这个例子里,我们将创建 另一个线程,我们将用两个线程演示多线程的工作方式,最后,我

C#深入理解AutoResetEvent和ManualResetEvent

当在C#使用多线程时就免不了使用AutoResetEvent和ManualResetEvent类,可以理解这两个类可以通过设置信号来让线程停下来或让线程重新启动,其实与操作系统里的信号量很相似(汗,考完考试已经有点忘记了).下面上代码 class Program { const int count = 10; //赋值为false也就是没有信号 static AutoResetEvent myResetEvent = new AutoResetEvent(false); static int n

C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex System.Threading.Semaphore System.Threading.EventWaitHandle System.Threading.ManualResetEvent System.Threading.AutoResetEvent System.Object System.Thre

C#多线程之二:ManualResetEvent和AutoResetEvent

初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送.可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态.如果某个线程调用WaitOne方法

C#中多线程信号控制ManualResetEvent和AutoResetEvent

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApplication22 { publ

线程学习笔记 等待句柄和线程池(摘自https://blog.gkarch.com/threading/part2.html#manualresetevent)

//如果你的应用有很多线程,这些线程大部分时间都在阻塞,那么可以通过调用ThreadPool.RegisterWaitForSingleObject来减少资源消耗.这个方法接受一个委托,它会在向等待句柄发信号时执行.当处于等待状态时,它不会浪费线程资源: static ManualResetEvent _starter = new ManualResetEvent (false); public static void Main() { RegisteredWaitHandle reg = Th