引入名称空间
using System.Threading.Tasks;
英文直译平行,就是并行计算,同一时间一起计算,执行顺序是乱的。里面都是静态方法,Parallel 主要提供了 For 系列方法和 ForEach 系列方法,并行处理所有项。两个系列的方法都有若干重载,但最常用也最易用的是这两个。
For
//Parallel里面这个方法,用法和普通的for循环一样,从fromInclusive开始,到toExclusive结束(fromInclusive < toExclusive)。每次迭代都执行body委托函数public static ParallelLoopResult For(int fromInclusive, int toExclusive, Action<int> body);Parallel.For(0, 10, (i) =>{Console.Write(i + " ");});//打印结果,随机的:4 5 8 6 1 2 7 0 3 9
Foreach
var all = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };Parallel.ForEach(all, (i) => {Console.Write($"{i} ");});//打印结果//5 7 3 2 1 9 0 8 4 6
Invoke
同时执行多个任务
static void Main(string[] args){Parallel.Invoke(A,B,C,D);}static void A(){Thread.Sleep(1000);Console.WriteLine("A");}static void B(){Thread.Sleep(1000);Console.WriteLine("B");}static void C(){Thread.Sleep(1000);Console.WriteLine("C");}static void D(){Thread.Sleep(1000);Console.WriteLine("D");}
线程安全资源锁定机制Interlocked
如果在Parallel.For内部执行++,+=操作,会出现bug。因为不是原子操作。用下面的写法,执行原子操作。
int sum = 0;Parallel.For(0,10, n => {Console.Write($"{n} ");Interlocked.Add(ref sum, 1);});Console.WriteLine(sum);
并行的意义在于处理耗时计算
Parallel的For和Foreach 对比传统的for 和 foreach。就是异步,并行。能用多线程处理任务,节省时间。
举个例子,一个工程交给一个人做,需要100天,若是交给10个人同时做,虽然不可能10天完成,可能15-30天就完成了,比100天快多了。
static void Main(string[] args){DateTime s = DateTime.Now;for(int i = 0; i < 10;i++){A();}DateTime e = DateTime.Now;Console.WriteLine($"用时{(e - s).TotalMilliseconds}毫秒");}static void A(){Thread.Sleep(1000);}//打印结果//用时10095.4379毫秒
static void Main(string[] args){DateTime s = DateTime.Now;Parallel.For(0, 10, (i) =>{A();});DateTime e = DateTime.Now;Console.WriteLine($"用时{(e - s).TotalMilliseconds}毫秒");}static void A(){Thread.Sleep(1000);}//用时2039.6993毫秒
对于耗费时间的操作,Parallel的操作显而易见效率更高。
