|
另外ManualResetEvent还有一个Reset方法,用来重新阻断调用者执行的,情况就好比你委托了这个小伙子送花给N个MM,
而又想准时地给这N个MM打电话的情况一样。
using System; using System.Threading;
public class TestMain { private static ManualResetEvent ent = new ManualResetEvent(false);
public static void Main() { Boy sender = new Boy(ent); Thread th = new Thread(new ThreadStart(sender.SendFlower)); th.Start();
ent.WaitOne(); //等待工作 Console.WriteLine("收到了吧,花是我送嘀:)"); Console.ReadLine(); }
}
public class Boy { ManualResetEvent ent;
public Boy(ManualResetEvent e) { ent = e; }
public void SendFlower() { Console.WriteLine("正在送花的途中"); for (int i = 0; i < 10; i++) { Thread.Sleep(200); Console.Write(".."); } Console.WriteLine("\r\n花已经送到MM手中了,boss");
ent.Set(); //通知阻塞程序 } }
而AutoResetEvent类故名思意,就是在每次Set完之后自动Reset。让执行程序重新进入阻塞状态。 即AutoResetEvent.Set() 相当于 ManualResetEvent.Set() 之后又立即 ManualResetEvent.Reset(), 其他的就没有什么不同的了。 举个送花给N个MM的例子:
using System; using System.Threading;
public class TestMain { private static AutoResetEvent ent = new AutoResetEvent(false);
public static void Main() { Boy sender = new Boy(ent);
for (int i = 0; i < 3; i++) { Thread th = new Thread(new ThreadStart(sender.SendFlower)); th.Start(); ent.WaitOne(); //等待工作 Console.WriteLine("收到了吧,花是我送嘀:)\r\n\r\n"); }
Console.ReadLine(); }
}
public class Boy { AutoResetEvent ent;
public Boy(AutoResetEvent e) { ent = e; }
public void SendFlower() { Console.WriteLine("正在送花的途中"); for (int i = 0; i < 10; i++) { Thread.Sleep(200); Console.Write(".."); } Console.WriteLine("\r\n花已经送到MM手中了,boss");
ent.Set(); //通知阻塞程序,这里的效果相当于 ManualResetEvent的Set()方法+Reset()方法 } }
|