.NET(C#):警惕PLINQ结果的无序性
.NET(C#):警惕PLINQ結(jié)果的無序性
2012年08月10日?? 綜合?? 共 620字 ? 字號?小?中?大???評論關(guān)閉PLINQ的運行結(jié)果是無序的,也就是不保持原來集合的順序來操作(當(dāng)然除了一些專門的排序操作)。原因則是線程的并發(fā)執(zhí)行本來就充滿了不確定性,把原來一個任務(wù)分割成好幾個部分同時進(jìn)行返回的結(jié)果會打亂原來的順序,如果要強制保留順序,肯定要浪費一些性能,PLINQ是可以這樣的,但默認(rèn)不這樣。
?
先看一個LINQ示例:
var?arr?=?new?int[] {?1,?2,?3,?4,?5?};
var?res?=?arr.Where(i?=>?i?!=?3);
?
結(jié)果是:
1, 2, 4, 5
?
?
順序是保持的。而PLINQ:
var?res?=?arr.AsParallel().Where(i?=>?i?!=?3);
?
?
結(jié)果順序變了:
1, 4, 5, 2
?
?
?
使用PLINQ的AsOrdered和AsUnordered可以命令PLINQ執(zhí)行保留原集合順序或者不保留。
把上面的PLINQ改成:
var?res?=?arr.AsParallel().AsOrdered().Where(i?=>?i?!=?3);
?
結(jié)果就是:1, 2, 4, 5了。
?
不過如果對PLINQ集合進(jìn)行了排序那么后續(xù)操作會自動保持順序,就像調(diào)用了AsOrdered。
var?res?=?arr.AsParallel().OrderBy(i?=>?i).Where(i?=>?i?!=?3);
?
結(jié)果也是:1, 2, 4, 5了。
?
注意某些PLINQ方法如果沒有保持順序執(zhí)行意義不大,比如Reverse方法:
var?res?=?arr.AsParallel().Reverse();
?
?
結(jié)果會是:
5, 3, 2, 1, 4
轉(zhuǎn)載于:https://www.cnblogs.com/micro-chen/p/8178753.html
總結(jié)
以上是生活随笔為你收集整理的.NET(C#):警惕PLINQ结果的无序性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UGUI图集管理
- 下一篇: java-Random类