1、 用法概述函数
Manual发音:英[ˈmænjuəl]ui
直译,手动重置事件spa
开发者的能够手动对线程间的交互进行手动控制.线程
2、构造函数xml
构造函数,若是为 true,则将初始状态设置为终止;若是为 false,则将初始状态设置为非终止。blog
public ManualResetEvent( bool initialState //是否为 终止状态 )
若是 ManualResetEvent 的初始状态是终止状态(即,若是其经过为 initialState 传递true 建立),则等待 ManualResetEvent 的线程不阻塞。(亦即WaitOne方法不能阻塞当前线程的执行)事件
若是初始状态为非终止状态(false),则线程调用 Set() 方法后才不阻塞。ci
故:一般状况下,咱们初始化为false(非终止状态)开发
3、须要理解和掌握的几个方法get
1.WaiOne
阻止当前线程,直到收到信号(固然初始化状态须要为false)
WaitOne有几个重载方法,经过时间进行WaitOne,若是超时就不阻塞了.
其余几个版本:MSDN地址
2.Set
将事件状态设置为终止状态,容许一个或多个等待线程继续。
3.ReSet
将事件状态设置为非终止状态,致使线程阻止。
4、Demo(网友提供)
using System; using System.Threading; namespace ThreadingTester { class ThreadClass { public static ManualResetEvent mre=new ManualResetEvent(false); public static void trmain() { Thread tr = Thread.CurrentThread; Console.WriteLine("thread: waiting for an event"); mre.WaitOne(11); Console.WriteLine("thread: got an event"); for(int x=0;x < 10;x++) { Thread.Sleep(1000); Console.WriteLine(tr.Name +": " + x); } } static void Main(string[] args) { Thread thrd1=new Thread(new ThreadStart(trmain)); thrd1.Name="thread1"; thrd1.Start(); for(int x=0;x < 10;x++) { Thread.Sleep(900); Console.WriteLine("Main:" + x); if(5==x) mre.Set(); } while(thrd1.IsAlive) { Thread.Sleep(1000); Console.WriteLine("Main: waiting for thread to stop"); } Console.Read(); } } }
5、使用场景
一般出现用于 不一样功能的代码且位于不一样的线程之中时, 须要进行数据协同.