”.Net 中提供了一些线程间更自由通信的工具,他们提供了经过"信号"进行通信的机制ide
能够经过ManualResetEvent,AutoResetEvent(他是在开门而且一个 WaitOne 经过后自动关门)来进行线程间的通信函数
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) //用来等待任意一个信号都变为“开门状态”spa
每次建立线程、销毁线程都比较消耗 cpu 资源,所以能够经过线程池进行优化。线程池是一组已经建立好的线程,随用随取,用完了不是销毁线程,而后放到线程池中,供其余人用线程
ThreadPool 类的一个重要方法:code
static bool QueueUserWorkItem(WaitCallback callBack, object state) //第二个重载是用来传递一个参数给线程代码的blog
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 }