本文内容 均参考自 《C#并行高级编程》

TPL 支持 数据并行(有大量数据要处理,必须对每个数据执行同样的操作, 任务并行(有好多可以并发运行的操作),流水线(任务并行和数据并行的结合体)

在.net 4.0 引入新的 Task Parallel Library 处理 并行开发 。

Parallel类  

关键词   :

Parallel.For   and Parallel.Foreach    -  负载均衡的多任务

Parallel.Invoke                              -  并行运行多任务

ParallelOptions                              -  指定最大并行度  (实例化一个类并修改MaxDegreeOfParallelism 属性的值 )

Environment.ProcessorCount          -   内核最大数

命令式任务并行 

关键词 : Task类 , 一个task 类表示一个异步操作 (需要考虑到任务的开销)

启动任务使用Task类的Start  方法 ,  等待线程完成使用WaitAll 方法 ,  通过CancellationTokenSource 的Cancel方法来 中断 Task的运行

怎样表达任务间的父子关系 ?   TaskCreationOption的AttachToParent来完成

怎样来表达串行任务 ? Task.ContinueWith

并发集合 

BlockingCollection

ConcurrentDictionary/ConcurrentQueue/ConcurrentStack

下面来一个例子是实操 C# 多任务并发。

场景 :  主进程 打开 一个 生产者线程 和 一个消费线程 。 他们之间可以相互对话, 如([动词,名词]) say,hello  task,a  .   生产者说一句话 消费者听, 消费者或应答或提交新的任务或结束自己。

代码

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Concurrent; namespace TPLTest
{
class Program
{
public static readonly int MAX_DATA_LENGTH = 256;
private static BlockingCollection<Message> bcstr = new BlockingCollection<Message>(MAX_DATA_LENGTH) ;
public static readonly string SAY_THANKS = "thanks";
public static readonly string SAY_WELCOME = "welcome!";
public static readonly string BYE = "bye";
public static readonly string SAY = "say";
public static readonly string TASK = "task";
public static readonly string TIMEOUT = "timeout";
public static readonly string ONLINE = "ONLINE";
public static readonly string WHAT = "What?";
public static readonly int WAIT = 20000;
public static void Main(string[] args)
{ //消费者线程
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = -1;
Parallel.Invoke(po,() => {
int selfID = Environment.CurrentManagedThreadId;
Message customer = new Message();
customer.CustomerThreadID = selfID ;
customer.content = ONLINE;
Console.WriteLine(customer.ToString(false));
while(true){
if (bcstr.TryTake(out customer, WAIT))
{
customer.CustomerThreadID = selfID ;
customer.doAction();
Console.WriteLine(" ");
Console.WriteLine(customer.ToString(false));
if (customer.endThread()){
break;
} } else {
if (customer == null)
{
customer = new Message();
}
customer.CustomerThreadID = selfID ;
customer.content = TIMEOUT;
Console.WriteLine(customer.ToString(false));
}
}
},
() => {
int prdID = Environment.CurrentManagedThreadId;
Message productor = new Message();
productor.ProductorThreadID = prdID;
productor.content = ONLINE;
Console.WriteLine(productor.ToString(true));
while(true){
Console.Write("Productor Behavior (i.e. say,hello) : ");
string msgContent = Console.ReadLine();
productor = new Message();
productor.ProductorThreadID = prdID;
productor.key = msgContent.Split(',')[0];
productor.content = msgContent.Split(',')[1];
bcstr.Add(productor);
if (productor.endThread()) {
break;
}
}
}); }
} class Message
{
public int ProductorThreadID {get; set;}
public int CustomerThreadID {get; set;}
public string key {get; set;}
public string content{get; set;}
public bool endThread()
{
return string.Compare(key, Program.BYE) == 0;
} public string ToString(bool isProductor){
return string.Format("{0} Thread ID {1} : {2}", isProductor ? "Productor" : "Customer",
isProductor ? ProductorThreadID.ToString() : CustomerThreadID.ToString(),
content);
} public void doAction(){
if (string.Compare(key, Program.SAY) == 0) {
content = string.Compare(content, Program.SAY_THANKS) == 0 ? Program.SAY_WELCOME : Program.WHAT;
} if (string.Compare(key, Program.TASK) == 0) {
Task taskA = Task.Factory.StartNew(() => {
Console.WriteLine("task A begin ");
Task ChildOfFatehrA = Task.Factory.StartNew(() => {
Console.WriteLine("Sub task A begin ");
Thread.Sleep(1000);
Console.WriteLine("Sub task A end ");
});
ChildOfFatehrA.Wait();
Console.WriteLine("task A end "); });
taskA.ContinueWith(taskB => {
Console.WriteLine("task B begin ");
Thread.Sleep(5000);
Console.WriteLine("task B end ");
});
taskA.Wait();
}
} }
}

  

C# 并行开发总结的更多相关文章

  1. [.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下)

    [.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下) 本篇导读: 接上篇继续介绍SVN的高级功能,即使用分支并行开发.随着需求的不断变更,新功能的增加.特别是 ...

  2. .NET下的并行开发(案例代码)

    以下主要是通过一个报表处理程序来说明并行开发的方式.对于数据冲突和共享,可以通过对象数组解决.设计到并行的核心代码已用红色标出.在并行程序的处理上,需要把原来串行的子公司变成一个一个类的对象,让所有的 ...

  3. .NET下的并行开发

    并行开发一直是程序员在开发项目中遇到的一道坎,但为了迎合硬件的升级,面对高端多核的处理器,并行编程势在必行.在.NET平台下的开发支持并行模式,下面用一个实际项目说明并行的高效率和神奇之处. 在优化中 ...

  4. 【翻译】CEDEC2014跨世代多平台并行开发PS4版如龙维新开发的一年

    本篇PPT讲述的是如龙4的开发过程中,集中在PS3和PS4并行开发中所遇到和解决的一些问题.如64位指针,DX9向DX11移植API的问题,以及在PS4上使用并行渲染在1080P下让FPS达到60等. ...

  5. 并行开发——Parallel的使用 -摘自网络

    随着多核时代的到来,并行开发越来越展示出它的强大威力,像我们这样的码农再也不用过多的关注底层线程的实现和手工控制, 要了解并行开发,需要先了解下两个概念:“硬件线程”和“软件线程”. 1. 硬件线程 ...

  6. 8天玩转并行开发——第一天 Parallel的使用

    转自:http://www.cnblogs.com/huangxincheng/archive/2012/04/02/2429543.html 随着多核时代的到来,并行开发越来越展示出它的强大威力,像 ...

  7. 并行开发学习随笔1——plinq并行

    这两天在看园友的文章 <8天玩转并行开发——第三天 plinq的使用> 对里面的第一个实例亲手实践了一下,发现了一点有意思的事情. 测试环境:.net 4.5 64位(如果是32位的,测试 ...

  8. 8天玩转并行开发——第三天 plinq的使用

    原文 8天玩转并行开发——第三天 plinq的使用 相信在.net平台下,我们都玩过linq,是的,linq让我们的程序简洁优美,简直玩的是爱不释手,但是传统的linq只是串行代码,在并行的 年代如果 ...

  9. 8天玩转并行开发——第二天 Task的使用

    原文 8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...

随机推荐

  1. hdoj 2829 Lawrence 四边形不等式优化dp

    dp[i][j]表示前i个,炸j条路,并且最后一个炸在i的后面时,一到i这一段的最小价值. dp[i][j]=min(dp[i][k]+w[k+1][i]) w[i][j]表示i到j这一段的价值. # ...

  2. 重看Decorator Pattern,联想到Delegate传递及Flags Enum--欢迎拍砖!

    话说装饰模式(Decorator)的动机是“动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活.[GOF <设计模式>]”.再次学到该模式,有感 ...

  3. sql语句常见错误

    1.两张表关联用的三种连接:  left join .right join .inner join区别 (备注:两个表链接肯定是根据两个表(如A B)中的两个字段值(如A.bId和B.id),相等就行 ...

  4. 知方可补不足~SQL数据库用户的克隆,SQL集群的用户同步问题

    我们知道在为sqlserver建立功能数据库时,通过会为库再建立一个登陆名,而这个登陆名时,只用来管理这个数据库,这是安全的,正确的.

  5. 剑指OFFER之最小的K个数(九度OJ1371)

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...

  6. mysql 开启记录慢查询记录

    以下操作,基于 mysql 5.5.31 版本源码安装配置. 修改 /etc/my.cnf 中 [mysqld] 中添加如下行 # 5.3 一下的配置 log-slow-queries=/var/lo ...

  7. ubuntu下查看文件md5

    终端输入md5sum --help: md5sum --help用法:md5sum [选项]... [文件]...显示或检查 MD5(128-bit) 校验和.若没有文件选项,或者文件处为" ...

  8. nginx利用image_filter动态生成缩略图

    转自:http://www.nginx.cn/2160.html "我如今是有些图片须要生成缩略图.这个如今加了image_filter这个已经实现了.但我不知道怎么样才干訪问我上传的原图& ...

  9. 句柄(Handle)

    1.句柄是什么?    在windows中,句柄是和对象一一对应的32位无符号整数值.对象可以映射到唯一的句柄,句柄也可以映射到唯一的对象.2.为什么我们需要句柄?     更准确地说,是window ...

  10. [012]泛型--lambda表达式捕获

    lambda表达式的捕获跟参数差不多,可以是值或者引用. 1.值捕获 与传值参数类似,采用值捕获的前期是变量可以拷贝:与参数不通透的是:被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝. ...