摘要: 在上篇文章中介绍了如何Break、Stop循环,以及如何定义线程局部变量。在本文中介绍如何在外部去取消循环、以及异常的处理。Cancel在并行的循环中支持通过传递ParallelOptions参数中的CancellationToken进行取消循环的控制,我们可以CancellationTokenSource实例化之后传递给ParallelOptions对象Cancellation值。下面来看个示例:?1234567891011121314151617181920212223242526272829303132[TestMethod] public void CancelLoop() { var 阅读全文
posted @ 2012-02-10 09:57 大江 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 现在已经进入了多核的时代,我们的程序如何更多的利用好cpu,答案是并行处理。在.net4.0之前我们要开发并行的程序是非常的困难,在.net4.0中,在命名空间System.Threading.Tasks提供了方便的并行开发的类库。本文中主要看看Data Parallel,看看并行的For、Foreach。Parallel.For首先先写一个普通的循环:?12345678910111213private void NormalFor() { for (var i = 0; i < 10000; i++) { for (var j = 0; j < 1000; j++) { for 阅读全文
posted @ 2012-02-10 09:56 大江 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 在上篇文章中看过了使用Parrallel.For、Parael.Foreach在效率上给我们带来的提高。本文就来如何终止循环、线程局部变量 进行说明。Thread-Local Variables首先我们来看下线程局部变量,是的我们也许一直在想我们如何去定义一个线程局部变量呢。先看段顺序执行的代码:?1234567891011[TestMethod()] public void NormalSequenceTest() { int[] nums = Enumerable.Range(0, 1000000).ToArray(); long total = 0; for (int i = 0; i 阅读全文
posted @ 2012-02-10 09:56 大江 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 在上篇文章中我们看过了多线程中的数据共享问题,以及通过分离执行来解决的办法。本篇文章就数据共享的同步处理中的一些常见的方法进行一些介绍。数据同步时的步骤我之前的文章我们对数据共享问题处理的方式是“分离执行”,我们通过把每个Task执行完成后的各自计算的值进行最后的汇总,也就是说多个Task之间不存在数据共享了,各自做各自的事,完全分离开来。可是这毕竟不是我们常规的处理办法,这样我们会花更多的经历在分离上。其实我们主要的数据共享在Sum上:for (int j = 0; j < 1000; j++){ Sum++;}那我们可以通过一种有序的机制来访问Sum,即当一个Task在进行Sum访问 阅读全文
posted @ 2012-02-10 09:35 大江 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 在上篇Post中我们看过了几种常用的同步类型,本篇文章会介绍下申明性的同步的实现以及对于集合类型数据共享的问题,首先看下申明性同步的实现。申明性同步我们可以通过使用Synchronization 特性来标识一个类,从而使一个类型的字段以及方法都实现同步化。在使用Synchronization 时,我们需要将我们的目标同步的类继承于System.ContextBoundObject类型。我们来看看之前的例子我们同步标识Synchronization 的实现:[Synchronization]class SumClass : ContextBoundObject{ private int _... 阅读全文
posted @ 2012-02-10 09:35 大江 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 在前几篇文章中我们看过Parallel Loop以及Task 部分内容,而在多线程的编程中我们较为痛疼的就是多线程中的数据共享问题以及数据同步的问题。本篇Post以及后面的几篇Post中会探讨下TPL中数据共享的常见问题以及其常规的解决办法。引例首先我们来看下面的一段代码:static void Main(string[] args){ int Sum = 0; Task[] tasks = new Task[10]; for (int i = 0; i < 10; i++) { tasks[i] = new Task(() => { ... 阅读全文
posted @ 2012-02-10 09:34 大江 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 在上篇文章中我们看过了如何创建Task,本篇文章就各种类型Task的使用进行说明。Task Continuations首先我们来看看延续的Task,所谓的延续的Task就是在第一个Task完成后自动启动下一个Task。我们通过ContinueWith方法来创建延续的Task。我们假设有一个接受xml解析的服务,首先从某个地方接受文件,然后解析入库,最后返回回执是否解析正确:?123456789[TestMethod] public void TaskParallelPrint() { var ReceiveTask = new Task(() => ReceiveXml()); var 阅读全文
posted @ 2012-02-10 09:33 大江 阅读(302) 评论(0) 推荐(0) 编辑
摘要: 在之前的文章中已经介绍过了Task的基本使用了,以及如何取消任务、任务继续等功能。本篇Post主要就Task的异常处理以及Wait功能进行些介绍。等待时间执行在TPL中我们可以通过三种方式进行等待,一是通过CancellTaken的WaitHanle进行等待、第二种则是通过传统的Tread.Sleep方法、第三种则通过Thread.SpainWait方法。CancellToken方式:static void Main(string[] args){ var cancell = new CancellationTokenSource(); var token = cancell.To... 阅读全文
posted @ 2012-02-10 09:33 大江 阅读(240) 评论(0) 推荐(0) 编辑
摘要: .Net 4.0 Parallel 编程(四) Task(上)2010-10-18 22:27 by Henry Cui, 2150 visits, 收藏, 编辑 在之前的文章中,已经介绍过了Parallel Loop(上、中、下)的相关内容。本篇文章中会就Task基础部分进行些介绍。初识Task首先我们来构建一个简单的Task的Demo:?12345678static void Main(string[] args) { Task.Factory.StartNew(() => { Console.WriteLine("Hello word!"); }); Conso 阅读全文
posted @ 2012-02-10 09:31 大江 阅读(346) 评论(0) 推荐(0) 编辑