.NET 4.0 之后 (e.g. 4.5) 添加了并行 For, ForEach 的支持.如果你的代码里有很多处 SIMD (单指令,多数据 Single Instruction Multiple Data). 就可以通过 Parallel.For 和 Parallel.ForEach 来进行多线程.使用方法非常简单:你不需要再手动创建几个线程,然后同时启动多线程,并等待它们的执行(同步).
首先,你需要引用这两个单元.
1 2 | using System.Threading; using System.Threading.Tasks; |
using System.Threading; using System.Threading.Tasks;
为了演示方便,建立了一个长度为10的数组,元素是 Double 类型.
1 | double[] nums = new double[10]; |
double[] nums = new double[10];
传统给它们一一赋值,比如这样:
1 2 3 | for (int i = 0; i < nums.length; i ++) { nums[i] = i; } // helloacm.com |
for (int i = 0; i < nums.length; i ++) { nums[i] = i; } // helloacm.com
现在,我们只需要 使用 Parallel.For; 第一个参数是索引下标,第二个参数是索引上标,然后第三个参数指定了操作.前两个参数指定了下标范围.
1 2 3 4 5 6 | Parallel.For(0, nums.Length - 1, i => { nums[i] = i; } ); // helloacm.com |
Parallel.For(0, nums.Length - 1, i => { nums[i] = i; } ); // helloacm.com
类似的,我们可以用 Parallel.ForEach,以下代码把数组的值显示出来.第一个参数是数据目标.第二个参数指定了并行的指令.
1 2 3 4 5 6 | Parallel.ForEach( nums, num => { Console.WriteLine("Number {0:R} on thread {1}", num, Thread.CurrentThread.ManagedThreadId); } ); |
Parallel.ForEach( nums, num => { Console.WriteLine("Number {0:R} on thread {1}", num, Thread.CurrentThread.ManagedThreadId); } );
由此可见,多线程处理数据变得非常容易简单.对于 ForEach, 来说,修改目标数据变量 例如上面例子中的变量 num 并不能改变原数据(数组)的值.这个变量是一个独立的值拷贝,只能读取.
不要假定并行的For一定会比较快.在数据量小的情况还有一些集合对象中, 在缓存,CPU预判断的帮助下, 顺序执行反而会更快.
结合以上两个程序片断,可以得到类似这样的输出.
Number 0 on thread 9 Number 0 on thread 9 Number 7 on thread 15 Number 5 on thread 14 Number 4 on thread 12 Number 8 on thread 16 Number 1 on thread 10 Number 2 on thread 11 Number 3 on thread 6 Number 6 on thread 13
GD Star Rating
loading...
本文一共 367 个汉字, 你数一下对不对.loading...
上一篇: 禁用板载显卡
下一篇: 登陆 WordPress 之后不显示广告
扫描二维码,分享本文到微信朋友圈
即使是TPL库, 仍然使用的是线程. 对于现在的高并发处理来说, 线程真的力不从心. 各种脚本语言都支持了协程的并发方式. 甚至golang直接有go关键字从基因上支持. 对.NET来说, 并发一直是其软肋, 不仅性能不行, 每个线程的类型对象指针和同步索引块还要白白浪费2M内存. 从MSSQL和IIS的性能和开销上就可见一斑.
所以, 来投入脚本语言的怀抱吧, 骚年.
是啊…NET 程序就这样, 内存大…做做服务器程序还可以..脚本的话我比较喜欢用 Python, LUA