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の生成は並列化「されない」。