Thread(线程)三
今天我们继续接着线程讲讲,上一章提到一下task概念,
首先接着task继续往下讲,在前章节提到过Thread怎么实现其他线程完成后再让主线程继续执行的功能,那么如果Task也需要线程等待事件,该怎么实现呢?
在这里介绍四种方法。
1、ContinueWhenAny方法
taskFactory.ContinueWhenAny(taskList.ToArray(), t => { //t.AsyncState Console.WriteLine("这里是ContinueWhenAny {0}", Thread.CurrentThread.ManagedThreadId); });
这种做法是在等task对象list集合中的任何一个线程完成后执行回调函数。
2、ContinueWhenAll方法
taskFactory.ContinueWhenAll(taskList.ToArray(), tList => { Console.WriteLine("这里是ContinueWhenAll {0}", Thread.CurrentThread.ManagedThreadId); });
这种是等list集合全部完成后在执行,在执行回调函数
3、WaitAny方法
Task.WaitAny(taskList.ToArray());//执行的线程等待某一个task的完成 Console.WriteLine("after WaitAny{0}", Thread.CurrentThread.ManagedThreadId);
只要等待其中任何一个线程完成,就会继续后面的程序代码。
4、WaitAll方法
Task.WaitAll(taskList.ToArray());//执行的线程等待全部的task的完成 Console.WriteLine("after WaitAll{0}", Thread.CurrentThread.ManagedThreadId);
等待多有线程完成后再去执行后面程序代码。
一般来说有这四种方法,可以解决等待事件的所有需求,如果不能实现,那有可能是程序设计上有些问题了。
***********************************************************************************************************************************************
Parallel:这个是.net后面提出的概念
Parallel.Invoke(() => this.TestThread("btnParallel_Click_0") , () => this.TestThread("btnParallel_Click_1") , () => this.TestThread("btnParallel_Click_2") , () => this.TestThread("btnParallel_Click_3") , () => this.TestThread("btnParallel_Click_4")); //等于使用4个task,然后主线程同步invoke一个委托 然后主线程waitall
这种做法就是让主线程也参与在计算中,充分利用资源吧。
Parallel.For(6, 10, t => { string name = string.Format("For btnParallel_Click_{0}", t); this.TestThread(name); }); Parallel.ForEach(new int[] { 5, 6, 7, 10, 8473847 }, t => { string name = string.Format("ForEach btnParallel_Click_{0}", t); this.TestThread(name); }); ParallelOptions parallelOptions = new ParallelOptions() { MaxDegreeOfParallelism = 5//相当于设置一个最大的线程数 }; Parallel.For(6, 15, (t, state) => { string name = string.Format("btnParallel_Click_{0}", t); this.TestThread(name); Console.WriteLine(state); state.Break();//退出单次循环 state.Stop();//退出全部的循环 return; });