关键词搜索

源码搜索 ×
×

C# Parallel并行遍历方法和执行任务

发布2018-06-01浏览2866次

详情内容

Parallel遍历分为For、ForEach,支持Lamda表达式,执行并行任务使用Invoke。

控制台示例程序:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace MyParallel
  8. {
  9. /// <summary>
  10. /// Parallel.For()和Paraller.ForEach()方法在每次迭代中调用相同的代码,而Parallel.Invoke()方法允许同时调用不同的方法。Parallel.ForEach()用于数据并行性,Parallel.Invoke()用于任务并行性;
  11. /// </summary>
  12. class Program
  13. {
  14. /// <summary>
  15. /// 并行运行方法-Parallel.For-遍历顺序不定
  16. /// </summary>
  17. /// <param name="args"></param>
  18. static void Main0(string[] args)
  19. {
  20. ParallelLoopResult result = Parallel.For(0, 10, i =>
  21. {
  22. Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
  23. Thread.Sleep(10);
  24. });
  25. Console.WriteLine("是否完成:{0}", result.IsCompleted);
  26. Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
  27. Console.Read();
  28. }
  29. /// <summary>
  30. /// 并行运行方法-Parallel.For-遍历顺序不定
  31. /// </summary>
  32. /// <param name="args"></param>
  33. static void Main1(string[] args)
  34. {
  35. ParallelLoopResult result = Parallel.For(0, 10, (i, state) =>
  36. {
  37. Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
  38. Thread.Sleep(10);
  39. if (i > 5)
  40. state.Break();
  41. });
  42. Console.WriteLine("是否完成:{0}", result.IsCompleted);
  43. Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
  44. Console.Read();
  45. }
  46. /// <summary>
  47. /// 并行运行方法-Parallel.ForEach-遍历顺序不定
  48. /// </summary>
  49. /// <param name="args"></param>
  50. static void Main2(string[] args)
  51. {
  52. string[] data = { "str1", "str2", "str3" };
  53. ParallelLoopResult result = Parallel.ForEach<string>(data, str =>
  54. {
  55. Console.WriteLine(str);
  56. });
  57. Console.WriteLine("是否完成:{0}", result.IsCompleted);
  58. Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
  59. Console.Read();
  60. }
  61. /// <summary>
  62. /// 并行运行方法-Parallel.ForEach-遍历顺序不定
  63. /// </summary>
  64. /// <param name="args"></param>
  65. static void Main3(string[] args)
  66. {
  67. string[] data = { "str1", "str2", "str3", "str4", "str5" };
  68. ParallelLoopResult result = Parallel.ForEach<string>(data, (str, state, i) =>
  69. {
  70. Console.WriteLine("迭代次数:{0},{1}", i, str);
  71. if (i > 3)
  72. state.Break();
  73. });
  74. Console.WriteLine("是否完成:{0}", result.IsCompleted);
  75. Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
  76. Console.Read();
  77. }
  78. /// <summary>
  79. /// 并行运行方法-Parallel.Invoke-并行任务执行无先后顺序
  80. /// </summary>
  81. /// <param name="args"></param>
  82. static void Main(string[] args)
  83. {
  84. Parallel.Invoke(() =>
  85. {
  86. Thread.Sleep(100);
  87. Console.WriteLine("method1");
  88. }, () =>
  89. {
  90. Thread.Sleep(10);
  91. Console.WriteLine("method2");
  92. });
  93. Console.Read();
  94. }
  95. }
  96. }

我的示例:

  1. ParallelLoopResult result= Parallel.ForEach(sims, (sim) =>
  2. {
  3. m_list_sim_channel.Add(new SimChannel(sim, (byte)new Random().Next(37)));
  4. });
  5. while (true)
  6. {
  7. if (result.IsCompleted)
  8. {
  9. Console.WriteLine("m_list_sim_channel count=" + m_list_sim_channel.Count);
  10. break;
  11. }
  12. }

参考文章:https://www.cnblogs.com/ricky-wang/p/7003162.html

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载