Visual Studio 2010中Parallel类实现并行计算

开发 后端
在.NET Framework 4.0中,在库的层次上,微软提供了大量的新内容来帮助程序员完成应用程序的并行化,其中包括Parallel LINQ,Task Parallel Library和Coordination Data Structures,这里我们就先来介绍一下最简单最常用的TPL。

将要跟随Visual Studio 2010一起发布的.NET Framework 4.0将包含很多基于库的对并行计算的支持,包括数据的并行化,任务的并行化等等,这一切都通过一个共同的工作调度器进行管理。

这些新的类型和类,将在System.Threading,System.Threading.Tasks,System.Linq和System.Collections.Concurrent这些名字空间中提供。通过这些新的类型和类,开发人员将无需面对如今复杂的多线程开发模式,而可以直接使用.NET Framework,更加高效简便地开发支持并行计算的应用程序,从而更加充分地利用多核CPU的优势,随着计算核心或者处理器的增加,以提升应用程序的性能。

而在.NET Framework中,Task Parallel Library (TPL)是其Parallel Extensions中一个重要组成部分,它提供了一种简便的多线程开发方式,通过它所提供的类或者函数,可以让程序员轻松地实现并行计算。其中,最简单的就是它的Parallel类

Parallel类

Parallel类就是TPL中的一个用于支持并行计算的类。Parallel类提供了诸多的静态函数,只需要简单的函数调用,我们就可以对常用的for循环,foreach循环进行并行化。下面我们通过一些实际的例子,来看看如何利用这个类将我们的应用程序并行化,以吃上多核这“免费的午餐”。

创建示例项目

为了演示如何将一个现有的项目并行化,我们需要先创建一个示例项目。在这个项目中,我们将模拟对数据的串行操作,然后介绍如何利用Parallel类将对数据的串行操作并行化,以充分利用多核CPU的优势,从而提升应用程序的性能。在Visual Studio 2010中,我们新创建一个Visual C#的控制台应用程序。然后在这个项目中添加一个类Employee,其实现代码如下:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. namespace ParallelDemo  
  6.  
  7. {  
  8.  
  9. // 职员类  
  10.  
  11. public class Employee  
  12.  
  13. {  
  14.  
  15. public string FirstName  
  16.  
  17. {  
  18.  
  19. get;  
  20. set;  
  21.  
  22. }  
  23.  
  24. public string LastName  
  25.  
  26. {  
  27.  
  28. get;  
  29. set;  
  30.  
  31. }  
  32.  
  33. public string Address  
  34.  
  35. {  
  36.  
  37. get;  
  38. set;  
  39.  
  40. }  
  41.  
  42. public DateTime HireDate  
  43.  
  44. {  
  45.  
  46. get;  
  47. set;  
  48.  
  49. }  
  50.  
  51. public int EmployeeID  
  52.  
  53. {  
  54.  
  55. get;  
  56. set;  
  57.  
  58. }  
  59.  
  60. // 模拟对数据的处理  
  61.  
  62. public static decimal Process(Employee employee)  
  63.  
  64. {  
  65.  
  66. Console.WriteLine(”Processing {0}”, employee.EmployeeID);  
  67.  
  68. // 产生一个随机数  
  69. // 用以表示处理当前数据需要的时间  
  70. var rand = new Random(DateTime.Now.Millisecond);  
  71. var delay = rand.Next(1, 5);  
  72. var count = 0;  
  73. var process = true;  
  74. while (process)  
  75.  
  76. {  
  77.  
  78. System.Threading.Thread.Sleep(1000);  
  79.  
  80. count++;  
  81. if (count >= delay)  
  82. process = false;  
  83.  
  84. }  
  85.  
  86. return delay;  
  87.  
  88. }  
  89.  
  90. }  
  91.  
  92. // 职员列表类  
  93. // 这是我们需要处理的数据  
  94.  
  95. public class EmployeeList : List  
  96.  
  97. {  
  98.  
  99. public EmployeeList()  
  100.  
  101. {  
  102.  
  103. // 将职员添加到列表中  
  104.  
  105. Add(new Employee { EmployeeID = 1FirstName = “张”, LastName = “三”, HireDate = DateTime.Parse(”1/1/2007″) });  
  106. Add(new Employee { EmployeeID = 2FirstName = “李”, LastName = “四”, HireDate = DateTime.Parse(”3/15/2006″) });  
  107. Add(new Employee { EmployeeID = 3FirstName = “王”, LastName = “麻子”, HireDate = DateTime.Parse(”6/17/2005″) });  
  108. Add(new Employee { EmployeeID = 4FirstName = “赵”, LastName = “匡胤”, HireDate = DateTime.Parse(”3/19/2000″) });  
  109. Add(new Employee { EmployeeID = 5FirstName = “钱”, LastName = “进”, HireDate = DateTime.Parse(”7/17/2003″) });  
  110. Add(new Employee { EmployeeID = 6FirstName = “孙”, LastName = “俊鹏”, HireDate = DateTime.Parse(”9/13/2005″) });  
  111. Add(new Employee { EmployeeID = 7FirstName = “李”, LastName = “明”, HireDate = DateTime.Parse(”12/3/2002″) });  
  112. Add(new Employee { EmployeeID = 8FirstName = “周”, LastName = “大勇”, HireDate = DateTime.Parse(”7/1/2008″) });  
  113. Add(new Employee { EmployeeID = 9FirstName = “吴”, LastName = “明子”, HireDate = DateTime.Parse(”1/7/2008″) });  
  114. Add(new Employee { EmployeeID = 10FirstName = “郑”, LastName = “邦万”, HireDate = DateTime.Parse(”11/1/2001″) });  
  115. Add(new Employee { EmployeeID = 11FirstName = “王”, LastName = “朝”, HireDate = DateTime.Parse(”4/21/2006″) });  
  116. Add(new Employee { EmployeeID = 12FirstName = “冯”, LastName = “玛丽”, HireDate = DateTime.Parse(”7/19/2006″) });  
  117. Add(new Employee { EmployeeID = 13FirstName = “陈”, LastName = “良乔”, HireDate = DateTime.Parse(”3/9/2001″) });  
  118. Add(new Employee { EmployeeID = 14FirstName = “褚”, LastName = “春晖”, HireDate = DateTime.Parse(”7/15/2005″) });  
  119. Add(new Employee { EmployeeID = 15FirstName = “卫”, LastName = “斯理”, HireDate = DateTime.Parse(”8/6/2003″) });  
  120. Add(new Employee { EmployeeID = 16FirstName = “蒋”, LastName = “中正”, HireDate = DateTime.Parse(”5/18/2005″) });  
  121. Add(new Employee { EmployeeID = 17FirstName = “沈”, LastName = “洋洋”, HireDate = DateTime.Parse(”8/5/2002″) });  
  122. Add(new Employee { EmployeeID = 18FirstName = “韩”, LastName = “斌”, HireDate = DateTime.Parse(”10/1/2006″) });  
  123. Add(new Employee { EmployeeID = 19FirstName = “杨”, LastName = “雪”, HireDate = DateTime.Parse(”12/7/2002″) });  
  124. Add(new Employee { EmployeeID = 20FirstName = “朱”, LastName = “辉”, HireDate = DateTime.Parse(”3/30/2001″) });  
  125. DateTime.Parse(”12/7/2002″) });  
  126. Add(new Employee { EmployeeID = 20FirstName = “朱”, LastName = “辉”, HireDate = DateTime.Parse(”3/30/2001″) });  
  127.  
  128. }  
  129.  
  130. }  
  131.  
  132. }  
  133.  
  134. }  
  135.  
  136. }  
  137.  

【编辑推荐】

  1. 在Visual Studio 2010选择合适的项目测试方法
  2. Visual Studio 2010多核并行环境下单元测试
  3. Visual Studio 2010 TFS探索之旅
  4. 浅析Visual Studio 2010压力测试的配置
  5. 一线程序员的Visual Studio 2010 RC初体验
责任编辑:王晓东 来源: 比特网博客
相关推荐

2010-03-19 13:17:26

Parallel

2009-11-13 14:59:12

Visual Stud

2010-03-17 08:49:49

Visual Stud

2009-10-27 09:12:50

Visual Stud

2009-11-11 12:55:52

Visual Stud

2010-01-28 09:07:50

Visual Stud

2010-03-11 16:09:38

Visual StudSilverligh

2009-09-04 09:39:15

Visual Stud

2010-03-02 09:10:41

Visual Stud

2009-12-02 09:43:38

Visual Stud

2009-11-10 13:43:37

Visual Stud

2010-02-24 09:39:49

Visual StudWindows Azu

2024-04-07 09:04:18

Parallel 类编程工具.NET

2010-03-22 14:45:40

云计算

2010-09-25 08:50:00

Visual Stud

2010-07-20 08:43:00

Visual Stud

2009-11-24 09:00:02

Visual Stud

2010-07-15 08:50:09

SharePointVisual Stud

2010-03-19 16:43:37

Visual Stud

2009-09-07 09:22:17

Visual Stud代码片段
点赞
收藏

51CTO技术栈公众号