引入名称空间

using System.Threading.Tasks;

英文直译平行,就是并行计算,同一时间一起计算,执行顺序是乱的。里面都是静态方法,Parallel 主要提供了 For 系列方法和 ForEach 系列方法,并行处理所有项。两个系列的方法都有若干重载,但最常用也最易用的是这两个。

For

  1. //Parallel里面这个方法,用法和普通的for循环一样,从fromInclusive开始,到toExclusive结束(fromInclusive < toExclusive)。每次迭代都执行body委托函数
  2. public static ParallelLoopResult For(int fromInclusive, int toExclusive, Action<int> body);
  3. Parallel.For(0, 10, (i) =>
  4. {
  5. Console.Write(i + " ");
  6. });
  7. //打印结果,随机的:4 5 8 6 1 2 7 0 3 9

Foreach

  1. var all = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  2. Parallel.ForEach(all, (i) => {
  3. Console.Write($"{i} ");
  4. });
  5. //打印结果
  6. //5 7 3 2 1 9 0 8 4 6

Invoke

同时执行多个任务

  1. static void Main(string[] args)
  2. {
  3. Parallel.Invoke(A,B,C,D);
  4. }
  5. static void A()
  6. {
  7. Thread.Sleep(1000);
  8. Console.WriteLine("A");
  9. }
  10. static void B()
  11. {
  12. Thread.Sleep(1000);
  13. Console.WriteLine("B");
  14. }
  15. static void C()
  16. {
  17. Thread.Sleep(1000);
  18. Console.WriteLine("C");
  19. }
  20. static void D()
  21. {
  22. Thread.Sleep(1000);
  23. Console.WriteLine("D");
  24. }

线程安全资源锁定机制Interlocked

如果在Parallel.For内部执行++,+=操作,会出现bug。因为不是原子操作。用下面的写法,执行原子操作。

  1. int sum = 0;
  2. Parallel.For(0,10, n => {
  3. Console.Write($"{n} ");
  4. Interlocked.Add(ref sum, 1);
  5. });
  6. Console.WriteLine(sum);

并行的意义在于处理耗时计算

Parallel的For和Foreach 对比传统的for 和 foreach。就是异步,并行。能用多线程处理任务,节省时间。
举个例子,一个工程交给一个人做,需要100天,若是交给10个人同时做,虽然不可能10天完成,可能15-30天就完成了,比100天快多了。

  1. static void Main(string[] args)
  2. {
  3. DateTime s = DateTime.Now;
  4. for(int i = 0; i < 10;i++)
  5. {
  6. A();
  7. }
  8. DateTime e = DateTime.Now;
  9. Console.WriteLine($"用时{(e - s).TotalMilliseconds}毫秒");
  10. }
  11. static void A()
  12. {
  13. Thread.Sleep(1000);
  14. }
  15. //打印结果
  16. //用时10095.4379毫秒
  1. static void Main(string[] args)
  2. {
  3. DateTime s = DateTime.Now;
  4. Parallel.For(0, 10, (i) =>
  5. {
  6. A();
  7. });
  8. DateTime e = DateTime.Now;
  9. Console.WriteLine($"用时{(e - s).TotalMilliseconds}毫秒");
  10. }
  11. static void A()
  12. {
  13. Thread.Sleep(1000);
  14. }
  15. //用时2039.6993毫秒

对于耗费时间的操作,Parallel的操作显而易见效率更高。

参考

【读书笔记】.Net并行编程高级教程—Parallel