static void MRES_SetWaitReset(){System.Threading.ManualResetEventSlim mres1 = new System.Threading.ManualResetEventSlim(false); // initialize as unsignaledSystem.Threading.ManualResetEventSlim mres2 = new System.Threading.ManualResetEventSlim(false); // initialize as unsignaledSystem.Threading.ManualResetEventSlim mres3 = new System.Threading.ManualResetEventSlim(true); // initialize as signaled// Start an asynchronous Task that manipulates mres3 and mres2var observer = Task.Factory.StartNew(() =>{mres1.Wait();Console.WriteLine("observer sees signaled mres1!");Console.WriteLine("observer resetting mres3...");mres3.Reset(); // should switch to unsignaledConsole.WriteLine("observer signalling mres2");mres2.Set();});Console.WriteLine("main thread: mres3.IsSet = {0} (should be true)", mres3.IsSet);Console.WriteLine("main thread signalling mres1");mres1.Set(); // This will "kick off" the observer Taskmres2.Wait(); // This won't return until observer Task has finished resetting mres3Console.WriteLine("main thread sees signaled mres2!");Console.WriteLine("main thread: mres3.IsSet = {0} (should be false)", mres3.IsSet);// It's good form to Dispose() a ManualResetEventSlim when you're done with itobserver.Wait(); // make sure that this has fully completedmres1.Dispose();mres2.Dispose();mres3.Dispose();}
当前方法有两个线程:主线程和oberver子线程。应用程序运行时,这两个线程同时执行,oberver子线程调用mres1.Wait(),所以使oberver子线程处于等待。主线程继续运行,当调用mres1.Set()主线程会给oberver子线程发个信号,主线程对oberver子线程说:"ok,oberver子线程你可以继续运行了",这时oberver线程mres1.Wait()收到该信号后,不再等待,继续执行下面代码。主线程执行到 mres2.Wait();方法时,这时主线程会挂起,处于等待状态,这时oberver子线程继续执行,当oberver子线程运行到mres2.Set(); oberver子线程会给主线程发送一个信号,oberver子线程会对主线程说:"OK,主线程可以运行了",于是mres2.Wait()不再等待,会继续运行. OK, 这就是这个方法的大体执行流程.
- 
	Wait()方法内部检测到IsSet属性的值,如果为false,线程会挂起。如果为IsSet为ture,线程不会挂起会继续执行。 
- 
	Reset()会将IsSet设置成false。 
- 
	Set() 会将这IsSet设置成true。 
