C# 并行开发总结
本文内容 均参考自 《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# 并行开发总结的更多相关文章
- [.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下)
[.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下) 本篇导读: 接上篇继续介绍SVN的高级功能,即使用分支并行开发.随着需求的不断变更,新功能的增加.特别是 ...
- .NET下的并行开发(案例代码)
以下主要是通过一个报表处理程序来说明并行开发的方式.对于数据冲突和共享,可以通过对象数组解决.设计到并行的核心代码已用红色标出.在并行程序的处理上,需要把原来串行的子公司变成一个一个类的对象,让所有的 ...
- .NET下的并行开发
并行开发一直是程序员在开发项目中遇到的一道坎,但为了迎合硬件的升级,面对高端多核的处理器,并行编程势在必行.在.NET平台下的开发支持并行模式,下面用一个实际项目说明并行的高效率和神奇之处. 在优化中 ...
- 【翻译】CEDEC2014跨世代多平台并行开发PS4版如龙维新开发的一年
本篇PPT讲述的是如龙4的开发过程中,集中在PS3和PS4并行开发中所遇到和解决的一些问题.如64位指针,DX9向DX11移植API的问题,以及在PS4上使用并行渲染在1080P下让FPS达到60等. ...
- 并行开发——Parallel的使用 -摘自网络
随着多核时代的到来,并行开发越来越展示出它的强大威力,像我们这样的码农再也不用过多的关注底层线程的实现和手工控制, 要了解并行开发,需要先了解下两个概念:“硬件线程”和“软件线程”. 1. 硬件线程 ...
- 8天玩转并行开发——第一天 Parallel的使用
转自:http://www.cnblogs.com/huangxincheng/archive/2012/04/02/2429543.html 随着多核时代的到来,并行开发越来越展示出它的强大威力,像 ...
- 并行开发学习随笔1——plinq并行
这两天在看园友的文章 <8天玩转并行开发——第三天 plinq的使用> 对里面的第一个实例亲手实践了一下,发现了一点有意思的事情. 测试环境:.net 4.5 64位(如果是32位的,测试 ...
- 8天玩转并行开发——第三天 plinq的使用
原文 8天玩转并行开发——第三天 plinq的使用 相信在.net平台下,我们都玩过linq,是的,linq让我们的程序简洁优美,简直玩的是爱不释手,但是传统的linq只是串行代码,在并行的 年代如果 ...
- 8天玩转并行开发——第二天 Task的使用
原文 8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...
随机推荐
- Android 解析 xml
URL httpUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection )httpUrl.openConnection(); c ...
- charindex的用法
declare @str nvarchar(50);set @str='462,464,2';select @str as '字符串'select len(@str) as '字符长度' select ...
- JavaScript要点(九)HTML DOM
通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object M ...
- cocos2d-x 判断点击命中坐标的几种方法
转自:http://www.cnblogs.com/jiackyan/archive/2013/04/14/3019893.html //重载 virtual bool ccTouchBegan(CC ...
- create tablespace 与 heap_insert 函数
先说 heap_insert 函数: /* * heap_insert - insert tuple into a heap * * The new tuple is stamped with cur ...
- 2015北京网络赛 F Couple Trees 暴力倍增
Couple Trees Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/123 ...
- cocos2d_x_08_游戏_FlappyBird
终于效果图: 环境版本号:cocos2d-x-3.3beta0 使用内置的物理引擎 计时器没有加入,可參考[cocos2d_x_06_游戏_一个都不能死] 主场景 // // FlappyBirdSc ...
- ShowcaseView-master
ShowcaseView.rar
- [node.js]RPC(远程过程调用)的实现原理
刚接触到RPC(远程过程调用),就是可以在本地调用远程机子上的程序的方法,看到一个简单的nodejs实现,用来学习RPC的原理很不错:nodejs light_rpc 使用示例: //服务端 ...
- C 双向链表
单链表的结点都只有一个指向下一个结点的指针 单链表的数据元素无法直接访问其前驱元素 逆序访问单链表中的元素是极其耗时的操作! len = LinkList_Length(list); for (i=l ...