本文内容 均参考自 《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. 射频识别技术漫谈(11)——Mifare系列卡的共性【worldsing笔记】

    Mifare是NXP公司生产的一系列遵守ISO14443A标准的射频卡,包Mifare S50.Mifare S70.Mifare UltraLight.Mifare Pro.Mifare Desfi ...

  2. Pivot运算符用于在列和行之间

    本文导读:T-SQL语句中,Pivot运算符用于在列和行之间对数据进行旋转或透视转换,PIVOT命令可以实现数据表的列转行,同时执行聚合运算,UNPIVOT则与其相反,实现数据的行转列. PIVOT通 ...

  3. 多线程操作Coredata(转)

    第一步:搭建 Core Data 多线程环境这个问题首先要解决的是搭建 Core Data 多线程环境.Core Data 对并发模式的支持非常完备,NSManagedObjectContext 的指 ...

  4. HTML中标签和元素的区别

    作为一个前端,相信大家最先接触应该都是HTML吧?在HTML中很多人可能都没有把什么叫标签,什么叫元素这个概念搞清楚,为了把这个大家不曾留意的易混淆的搞清楚,特作此一文彻底解决掉这个问题! 首先我们来 ...

  5. ThinkPHP CURD方法盘点:data方法

    data方法也是模型类的连贯操作方法之一,用于设置当前要操作的数据对象的值,可能大家不太习惯用这个方法,今天来讲解下如何用好data方法. 用法 写操作 通常情况下我们都是通过create方法或者赋值 ...

  6. 《Linux内核修炼之道》 之 高效学习Linux内核

    http://blog.csdn.net/fudan_abc/article/details/5738436

  7. DTCC2016

    http://pan.baidu.com/share/home?uk=4043574767#category/type=0

  8. php中body下出现莫名空白字符

    php中body下出现莫名空白字符,出现原因 1. 模板前面有莫名格式空格,删不掉,必须把模板里面东西复制出来,新建一个文件弄进去,覆盖原有的 2.docutype前面出现代码,也会导致此问题(有可能 ...

  9. Debian Linux下如何以root账号登录桌面

    I Debian Linux 方法有两种,一是图形界面方式设置,一是命令行设置: A. 图形界面方式: GNOME桌面下:打开“系统主菜单“,选择”系统>系统管理>登录窗口”,在弹出的窗口 ...

  10. C#_数据库基本交互

    //app.config <?xml version="1.0" encoding="utf-8" ?> <configuration> ...