惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
U
Unit 42
MyScale Blog
MyScale Blog
B
Blog
阮一峰的网络日志
阮一峰的网络日志
量子位
IT之家
IT之家
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
Recent Announcements
Recent Announcements
V
Visual Studio Blog
G
Google Developers Blog
Last Week in AI
Last Week in AI
雷峰网
雷峰网
博客园 - 聂微东
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
博客园 - 司徒正美
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏

博客园 - 还没断气

最新发现google首页居然可以打游戏 邮件处理 window7常用帮助 google 给发布商客户的信 google昨天才走,今天就不能使用了 各种代码注入举例 Sql注入和Html注入 给开发人员的忠告 早晨一杯水拥有健康好身体 做一个懒人吧 简单一些 快乐一些 毕业三年决定你的命运 生命真的不重要吗? 你是否愿意每周最少工作80小时 (转) .NET 4中废弃的特性 深度解析Windows Phone 7开发 详解ASP.NET的SEO:服务器控件背后故事 - 还没断气 - 博客园 .NET 4新特性:表、SEO及可扩展输出缓存 Windows Server 2008 R2上安装WSUS 3.0 SP2 谷歌发布.NET平台YouTube SDK - 还没断气 iPhone破解软件定制版blackra1n 提供下载
VS2010中Parallel类实现并行计算
还没断气 · 2010-03-10 · via 博客园 - 还没断气

在.NET Framework 4.0中,在库的层次上,微软提供了大量的新内容来帮助程序员完成应用程序的并行化,其中包括Parallel LINQ(PLINQ),Task Parallel Library(TPL)和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,其实现代码如下:

using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  namespace ParallelDemo

  {

  // 职员类public class Employee

  {

public string FirstName

  {

get;set;

  }

public string LastName

  {

get;set;

  }

public string Address

  {

get;set;

  }

public DateTime HireDate

  {

get;set;

  }

public int EmployeeID

  {

get;set;

  }

// 模拟对数据的处理public static decimal Process(Employee employee)

  {

  Console.WriteLine(

"Processing {0}", employee.EmployeeID);// 产生一个随机数// 用以表示处理当前数据需要的时间

  var rand

= new Random(DateTime.Now.Millisecond);

  var delay

= rand.Next(1, 5);

  var count

= 0;

  var process

= true;while (process)

  {

  System.Threading.Thread.Sleep(

1000);

  count

++;if (count >= delay)

  process

= false;

  }

  return delay;

  }

  }

// 职员列表类// 这是我们需要处理的数据public class EmployeeList : List

  {

public EmployeeList()

  {

// 将职员添加到列表中

  Add(

new Employee { EmployeeID = 1, FirstName = "", LastName = "", HireDate = DateTime.Parse("1/1/2007") });

  Add(

new Employee { EmployeeID = 2, FirstName = "", LastName = "", HireDate = DateTime.Parse("3/15/2006") });

  Add(

new Employee { EmployeeID = 3, FirstName = "", LastName = "麻子", HireDate = DateTime.Parse("6/17/2005") });

  Add(

new Employee { EmployeeID = 4, FirstName = "", LastName = "匡胤", HireDate = DateTime.Parse("3/19/2000") });

  Add(

new Employee { EmployeeID = 5, FirstName = "", LastName = "", HireDate = DateTime.Parse("7/17/2003") });

  Add(

new Employee { EmployeeID = 6, FirstName = "", LastName = "俊鹏", HireDate = DateTime.Parse("9/13/2005") });

  Add(

new Employee { EmployeeID = 7, FirstName = "", LastName = "", HireDate = DateTime.Parse("12/3/2002") });

  Add(

new Employee { EmployeeID = 8, FirstName = "", LastName = "大勇", HireDate = DateTime.Parse("7/1/2008") });

  Add(

new Employee { EmployeeID = 9, FirstName = "", LastName = "明子", HireDate = DateTime.Parse("1/7/2008") });

  Add(

new Employee { EmployeeID = 10, FirstName = "", LastName = "邦万", HireDate = DateTime.Parse("11/1/2001") });

  Add(

new Employee { EmployeeID = 11, FirstName = "", LastName = "", HireDate = DateTime.Parse("4/21/2006") });

  Add(

new Employee { EmployeeID = 12, FirstName = "", LastName = "玛丽", HireDate = DateTime.Parse("7/19/2006") });

  Add(

new Employee { EmployeeID = 13, FirstName = "", LastName = "良乔", HireDate = DateTime.Parse("3/9/2001") });

  Add(

new Employee { EmployeeID = 14, FirstName = "", LastName = "春晖", HireDate = DateTime.Parse("7/15/2005") });

  Add(

new Employee { EmployeeID = 15, FirstName = "", LastName = "斯理", HireDate = DateTime.Parse("8/6/2003") });

  Add(

new Employee { EmployeeID = 16, FirstName = "", LastName = "中正", HireDate = DateTime.Parse("5/18/2005") });

  Add(

new Employee { EmployeeID = 17, FirstName = "", LastName = "洋洋", HireDate = DateTime.Parse("8/5/2002") });

  Add(

new Employee { EmployeeID = 18, FirstName = "", LastName = "", HireDate = DateTime.Parse("10/1/2006") });

  Add(

new Employee { EmployeeID = 19, FirstName = "", LastName = "", HireDate = DateTime.Parse("12/7/2002") });

  Add(

new Employee { EmployeeID = 20, FirstName = "", LastName = "", HireDate = DateTime.Parse("3/30/2001") });

  DateTime.Parse(

"12/7/2002") });

  Add(

new Employee { EmployeeID = 20, FirstName = "", LastName = "", HireDate = DateTime.Parse("3/30/2001") });

  }

  }

  }

  }

  }

  }