C#における複数スレッド並列処理(Parallel, PLINQ)
C# による並列プログラミング | iSUS
- github のサンプルコードが多い。
C#によるマルチコアのための非同期/並列処理プログラミング - Google ブックス
- 以下の様な書き方で並列「操作」を複数スレッドを利用する例を示している
# https://msdn.microsoft.com/ja-jp/library/Dd460705(v=VS.110).aspx Parallel.Invoke(new Action[]{ () => 処理A, () => 処理B, () => 処理C, () => 処理D, });
このほかPLINQには、チェインの途中から順次実行に戻したり、順序が崩れないように指定したりもできます。また、キャンセルトークンを渡すこともできます。
www.kekyo.net
var rand = new Random(); var captured = new ConcurrentDictionary<int, int>(); var results = Enumerable.Range(0, 100000). AsParallel(). Select(delegate(index) { return new { value = rand.Next(200000), index = index }; }). Where(delegate(entry) { return captured.TryAdd(entry.value, entry.index) }). Select(delegate(entry) { return entry.value; });
つまり、乱数の生成と辞書への追加が、期待通り並列化される。Rangeによるindexの生成は並列化「されない」。