.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
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK