一.WaitHandle:
”.Net 中提供了一些线程间更自由通讯的工具,他们提供了通过"信号"进行通讯的机制
可以通过ManualResetEvent,AutoResetEvent(他是在开门并且一个 WaitOne 通过后自动关门)来进行线程间的通讯
-
- waitOne: 等待开门
- Set: 开门
- Reset: 关门
static void Main(string[] args) { ManualResetEvent mre = new ManualResetEvent(false);//构造函数 false 表示“初始状态为关门”,设置为 true 则初始化为开门状态 Thread thread = new Thread(() => { Console.WriteLine("开始等着开门"); mre.WaitOne(); //这里程序就等着开门 Console.WriteLine("终于开门了"); }); thread.Start(); Console.WriteLine("按任意键开门"); Console.ReadKey(); mre.Set();//开门 Console.ReadKey(); }
mre.WaitOne(5000) //还可以设置等待超时时间:返回true或false
WaitHandle.WaitAll(WaitHandle[] waitHandles) //用来等待所有信号都变为“开门状态”
WaitHandle.WaitAny(WaitHandle[] waitHandles) //用来等待任意一个信号都变为“开门状态”
二.线程池:
每次创建线程、销毁线程都比较消耗 cpu 资源,因此可以通过线程池进行优化。线程池是一组已经创建好的线程,随用随取,用完了不是销毁线程,然后放到线程池中,供其他人用
ThreadPool 类的一个重要方法:
static bool QueueUserWorkItem(WaitCallback callBack, object state) //第二个重载是用来传递一个参数给线程代码的
1 static void Main(string[] args) 2 { 3 for (int i = 0; i < 20; i++) 4 { 5 ThreadPool.QueueUserWorkItem(obj => { 6 Console.WriteLine("i="+obj); 7 8 },i); 9 } 10 for (int i = 0; i < 20; i++) 11 { 12 Console.WriteLine("hello"); 13 } 14 Console.ReadKey(); 15 }