「C Sharpの基礎 - マルチスレッド」の版間の差分

ナビゲーションに移動 検索に移動
254行目: 254行目:
     return await Task.Delay(1000).ConfigureAwait(false);
     return await Task.Delay(1000).ConfigureAwait(false);
  }
  }
</syntaxhighlight>
<br><br>
== Parallelクラス ==
CPU処理を並列実行する場合、<code>Parallel</code>クラスを使用する。<br>
<br>
以下の例では、methodAsync1メソッド、methodAsync2メソッド、methodAsync3メソッドが並列実行される。<br>
<u>ただし、CPUのコア数やスレッドプールの空き状況によっては、並列実行されない場合もあることに注意する。</u><br>
<br>
なお、<code>Parallel</code>クラスには、<code>Parallel.Invoke</code>メソッドの他に<code>Parallel.For</code>メソッドや<code>Parallel.ForEach</code>メソッドも存在する。<br>
また、<code>Parallel.Invoke</code>メソッドの第1引数の<code>ParallelOptions</code>クラスは省略可能である。<br>
<syntaxhighlight lang="c#">
// Invokeメソッドの引数はAction型
Parallel.Invoke(new ParallelOptions() { MaxDegreeOfParallelism = 4 }, // 最大同時並列数:4
                methodAsync1,                  // 戻り値が無いAction型の場合
                () => { methodAsync2(100); },  // 戻り値があるFunc型の場合
                () =>
                {  // 直接処理を記述してもよい
                    int n = 400;
                    methodAsync3(n);
                }
                );
</syntaxhighlight>
<br><br>
== PLINQ(ParallelEnumerable) ==
<code>LINQ</code>(<code>PLINQ</code>)を使用して、並列実行することもできる。<br>
<code>PLINQ</code>では、<code>AsParallel</code>拡張メソッド以降のコードが並列化される。<br>
<br>
以下の例では、処理A(ファイルの読み込み)はシングルスレッドで実行、処理B(ハッシュ値計算)はマルチスレッドで実行している。<br>
なお、<code>AsParallel</code>拡張メソッドの実行後の<code>WithDegreeOfParallelism</code>拡張メソッドは省略可能である。<br>
<syntaxhighlight lang="c#">
// ファイルのハッシュ値を計算するプログラム
var files = Directory.GetFiles(Environment.SystemDirectory, "*.exe");
var filehash = files
                .Select(f => new { File = f, Data = File.ReadAllBytes(f) })                    // 処理A(ファイルの読み込み)
                .AsParallel()
                .WithDegreeOfParallelism(4)                                                    // 最大同時並列数:4
                .Select(f => new { File = f.File, Hash = SHA256.Create().ComputeHash(f.Data)})  // 処理B(ハッシュ値計算)
                .ToArray();
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>

案内メニュー