Parallel.Invoke 主要用于任务的并行

这个函数的功能和Task有些相似,就是并发执行一系列任务,然后等待所有完成。和Task比起来,省略了Task.WaitAll这一步,自然也缺少了Task的相关管理功能。它有两种形式:

  • Parallel.Invoke( params Action[] actions);
  • Parallel.Invoke(Action[] actions,TaskManager manager,TaskCreationOptions options);
  1. static void Test()
  2. {
  3. var actions = new Action[]
  4. {
  5. () => ActionTest("test 1"),
  6. () => ActionTest("test 2"),
  7. () => ActionTest("test 3"),
  8. () => ActionTest("test 4")
  9. };
  10. Console.WriteLine("Parallel.Invoke 1 Test");
  11. Parallel.Invoke(actions);
  12. Console.WriteLine("结束!");
  13. }
  14. static void ActionTest(object value)
  15. {
  16. Console.WriteLine(">>> thread:{0}, value:{1}",
  17. Thread.CurrentThread.ManagedThreadId, value);
  18. }

For方法,主要用于处理针对数组元素的并行操作(数据的并行)

  1. static void Main(string[] args)
  2. {
  3. int[] nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
  4. Parallel.For(0, nums.Length, (i) =>
  5. {
  6. Console.WriteLine($"索引:{i},数组元素:{nums[i]},线程ID:{Thread.CurrentThread.ManagedThreadId});
  7. });
  8. Console.ReadKey();
  9. }

Foreach方法,主要用于处理泛型集合元素的并行操作(数据的并行)

  1. public void Test()
  2. {
  3. List<int> nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
  4. Parallel.ForEach(nums, (item) =>
  5. {
  6. Console.WriteLine($"输出元素:{item}、线程ID:{Thread.CurrentThread.ManagedThreadId}" );
  7. });
  8. Console.ReadKey();
  9. }

结语

  • Parallel.For()和Paraller.ForEach()方法在每次迭代中调用相同的代码,而Parallel.Invoke()方法允许同时调用不同的方法。Parallel.ForEach()用于数据并行性,Parallel.Invoke()用于任务并行性;