class Program { /**//// <summary> /// ManualResetEvent建立时是把false作为start的初始状态,这个类用于通知另一个线程,让它等待一个或多个线程。 /// 如这个例子中,等待线程thread1线程调用mre.WaitOne(), 用于发信号的线程调用mre.Set(). /// </summary> public static ManualResetEvent mre = new ManualResetEvent(false); public static void trmain() { Thread tr = Thread.CurrentThread; Console.WriteLine(tr.Name + " 开始第一波等待"); mre.WaitOne(); //等到什么时候呢?等到mre.Set()被调用 Console.WriteLine(tr.Name + " 第一波启动t"); mre.Reset(); //再次重置 Console.WriteLine(tr.Name + " 开始第二波等待"); mre.WaitOne(); //再次等待 Console.WriteLine(tr.Name + " 第二波启动"); 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(); Thread thrd2 = new Thread(new ThreadStart(trmain)); thrd2.Name = "thread2"; thrd2.Start(); for (int x = 0; x < 10; x++) { Thread.Sleep(900); Console.WriteLine("Main :" + x); if (5 == x) { mre.Set(); //子线程的mre.WaitOne()可以执行了。第一次等待进程 //; //如果什么都不做呢,mre.Wait()那个线程就一直等在那里了? } } while (thrd1.IsAlive) { Thread.Sleep(1000); Console.WriteLine("Main: waiting for thread to stop"); mre.Set(); //第二次通知等待进程 } } } 转载于:https://www.cnblogs.com/fifastar/archive/2008/07/07/1237582.html