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