13,007
回編集
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> |