普通的for 、foreach 都是顺序依次执行的。
C#当中我们一般使用for和foreach执行循环,有时候我们呢的循环结构每一次的迭代需要依赖以前一次的计算或者行为。但是有时候则不需要。如果迭代之间彼此独立,并且程序运行在多核处理器上,如果能将不同的迭代放到不同的处理器上并行处理,则会获益匪浅。Parallel.For和Parallel.ForEach就是为此而生的。






Parallel中途退出循环和异常处理
1、在串行代码中我们break一下就搞定了,但是并行就不是这么简单了,不过没关系,在并行循环的委托参
数中提供了一个ParallelLoopState,该实例提供了Break和Stop方法来帮我们实现。
Break: 当然这个是通知并行计算尽快的退出循环,比如并行计算正在迭代100,那么break后程序还会迭代所有小于100的。
Stop:这个就不一样了,比如正在迭代100突然遇到stop,那它啥也不管了,直接退出。
2、异常处理
首先任务是并行计算的,处理过程中可能会产生n多的异常,那么如何来获取到这些异常呢?
普通的Exception并不能获取到异常,然而为并行诞生的AggregateExcepation就可以获取到一组异常。

try
{
Parallel.Invoke(Run1, Run2);
}
catch (AggregateException aex)
{
foreach (var ex in aex.InnerExceptions)
{
Console.WriteLine(ex.Message);
}
}
**

线程安全集合

**
List list = new List();
Parallel.For(0, 10000, item =>
{
list.Add(item);
});
Console.WriteLine(“List’s count is {0}”,list.Count());

看到结果中显示的5851,但是我们循环的是10000次啊!怎么结果不对呢?这是因为List是非线程
安全集合
,意思就是说所有的线程都可以修改他的值。
下面我们来看下并行集合 —— 线程安全集合,在System.Collections.Concurrent命名空间中,首先来
看一下ConcurrentBag泛型集合,其用法和List类似,先来写个方法测试一下:
ConcurrentBag list = new ConcurrentBag();
Parallel.For(0, 10000, item =>
{
list.Add(item);
});
Console.WriteLine(“ConcurrentBag’s count is {0}”, list.Count());

ConcurrentBag中的数据并不是按照顺序排列的,**顺序是乱的,随机的。**我们平时使用的
Max、First、Last等linq方法都还有。其时分类似Enumerable的用法
关于线程安全的集合还有很多,和我们平时用的集合都差不多,比如类似Dictionary的
ConcurrentDictionary,还有ConcurrentStack,ConcurrentQueue等。

Parallel Linq
public class Custom
{
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
}
public static void TestPLinq()
{
Stopwatch sw = new Stopwatch();
List customs = new List();
for (int i = 0; i < 2000000; i++)
{
customs.Add(new Custom() { Name = “Jack”, Age = 21, Address = “NewYork” });
customs.Add(new Custom() { Name = “Jime”, Age = 26, Address = “China” });
customs.Add(new Custom() { Name = “Tina”, Age = 29, Address = “ShangHai” });
customs.Add(new Custom() { Name = “Luo”, Age = 30, Address = “Beijing” });
customs.Add(new Custom() { Name = “Wang”, Age = 60, Address = “Guangdong” });
customs.Add(new Custom() { Name = “Feng”, Age = 25, Address = “YunNan” });
}
sw.Start();
var result = customs.Where(c => c.Age > 26).ToList();
sw.Stop();
Console.WriteLine(“Linq time is {0}.”,sw.ElapsedMilliseconds);
sw.Restart();
sw.Start();
var result2 = customs.AsParallel().Where(c => c.Age > 26).ToList();
sw.Stop();
Console.WriteLine(“Parallel Linq time is {0}.”, sw.ElapsedMilliseconds);
}

PLINQ

AsOrdered()与orderby
AsOrdered:保留查询的结果按源序列排序,在并行查询中,多条数据会被分在多个区域中进行查询,查询后再将
多个区的数据结果合并到一个结果集中并按源序列顺序返回。
orderby:将返回的结果集按指定顺序进行排序

//采用 AsOrdered 排序策略 其数据输出结果 是直接将分区数据结果合并起来 并按原始数据顺序排序/
var productListPLinq1 = from product in products.AsParallel().AsOrdered()
where (product.Length == 1)
select product;

var lookupList = customs.ToLookup(i => i.Age);

ToLookup方法是将集合转换成一个只读集合,所以在大数据量分组时性能优于List.

任务并行库(Task Parellel Library)parallel.for parallel.foreach、List、ConcurrentBag 并行集合、线程安全结合相关推荐

  1. C#多线程编程系列(五)- 使用任务并行库

    目录 1.1 简介 1.2 创建任务 1.3 使用任务执行基本的操作 1.4 组合任务 1.5 将APM模式转换为任务 1.6 将EAP模式转换为任务 1.7 实现取消选项 1.8 处理任务中的异常 ...

  2. 三分钟总览微软任务并行库TPL

    点击上方蓝字进行关注 有小伙伴问我每天忽悠的TPL是什么? ☹️ 这次站位高一点,严肃讲一讲. 引言 俗话说,不想开飞机的程序员不是一名好爸爸:作为微软技术栈的老鸟,一直将代码整洁之道奉为经典, 优秀 ...

  3. .NET异步程序设计之任务并行库

    目录 1.简介 2.Parallel类 2.0 Parallel类简介 2.1 Parallel.For() 2.2 Parallel.ForEach() 2.3 Parallel.Invoke() ...

  4. Net 4.0并行库实用性演练

    引言 随着CPU多核的普及,编程时充分利用这个特性越显重要.上篇首先用传统的嵌套循环进行数组填充,然后用.NET 4.0中的System.Threading.Tasks提供的Parallel Clas ...

  5. 让一切“并行”——任务并行库原理及应用

    19.1让一切"并行"--任务并行库原理及应用 19.3.1 任务并行库简介          任务并行库(TPL:Task Parallel Library)是.NET 4.0为 ...

  6. Delphi D10.X 并行库PPL编程之TTask

    Delphi D10.X 并行库PPL编程系列之 TTask delphi中的RTL(运行库)提供了并行编程库(PPL --Parallel Programming Library) ,让您的应用程序 ...

  7. 微软并行库初体验之TPL

    前端时间因为要做个大数据量分析,所以用C#写了个脚本跑,不过由于算法复杂度问题,初步估计需要40小时才能跑完.为了加快运算,我一开始想到了 并行计算,利用MPICH或其他类似的分布式计算框架开发,不过 ...

  8. Delphi XE7中新并行库

    Delphi XE7中添加了新的并行库,和.NET的Task和Parellel相似度99%. 详细内容能够看以下的文章: http://www.delphifeeds.com/go/s/119574 ...

  9. Delphi D10.X 并行库PPL编程之 TParallel.For

    Delphi D10.X 并行库PPL编程系列之 TParallel.For delphi中的RTL(运行库)提供了并行编程库(PPL --Parallel Programming Library) ...

最新文章

  1. Linux设备驱动程式之读书笔记(二) [转]
  2. 网易云出现undefined symbol: fribidi_get_par_embedding_levels_ex
  3. redis aof持久化遇到的Can't open the append-only file Permissi
  4. java8 入门脚本之家_Java 8中的Lambda表达式
  5. 信息学奥赛一本通 1820:【00NOIP提高组】进制转换 | 洛谷 P1017 [NOIP2000 提高组] 进制转换
  6. 关于Web面试的基础知识点--Html+Css(四)
  7. 鸿蒙系统空城计,鸿蒙系统到底什么时候用在手机上?
  8. 【明哥报错簿】之 mybatis异常invalid comparison: java.util.Date and java.lang.String
  9. android device id修改器,修改硬盘ID硬盘序列号工具(Serial Number Changer)
  10. 激活工具带毒感染量近60万,而北京等四城市用户不被攻击
  11. jdk,j2sdk,j2eesdk,jre 的区别和联系
  12. arx 锁定解锁图层 刷新透明度
  13. 延时消息推送的正确姿势你get到了吗?
  14. deepin系统引导_Windows 与 Deepin 双系统启动顺序的修改
  15. 戴着镣铐与狼共舞!深度解读新势力造车迷局
  16. 使用迅雷下载百度云盘数据
  17. 今天又接到了交通罚单
  18. HTTP–Response详解
  19. 计算机类英文自我介绍,优秀的计算机专业英文自我介绍
  20. 交易履约之结算平台实践

热门文章

  1. 有好看的女生用的黑色壁纸吗?
  2. 无任何格外需求的命令行C++飞机大战,内含BOSS,动画,千行代码免费奉上
  3. CUDA学习:Windows下的CUDA环境配置
  4. 零基础入门编程神器!苹果的免费编程应用出了Mac版了
  5. 陶陶摘苹果编程(C语言)
  6. USACO 2022 December Contest, BronzeProblem 1. Cow College 题解
  7. Matlab顶级期刊配色工具Rggsci
  8. 混沌工程-为什么推广的如此困难
  9. 基于微信小程序的二手闲置跳蚤市场交易平台 uni-app
  10. Oracle实验二 表的查询和更新