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

ナビゲーションに移動 検索に移動
1行目: 1行目:
== 概要 ==
== 概要 ==
.NET Framework 4.5で導入されたC# 5.0(Visual Studio 2012) からは、マルチスレッドプログラミングをコンパイラレベルでサポートしている。<br>
C#のマルチスレッドプログラミングは、並行処理を実現する強力な機能である。<br>
具体的には、<code>async</code><code>await</code>というキーワードが導入された。<br>
.NET Framework 4.5以降、C# 5.0以降はコンパイラレベルでマルチスレッドをサポートしており、特に<code>async</code> / <code>await</code>キーワードの導入により、非同期プログラミングが大幅に簡素化された。<br>
これは、タスクベース非同期パターン(Task-based Asynchronous Pattern、TAP)を実装するものである。<br>
<br>
<br>
このタスクベース非同期パターンでは、処理の開始はMethodNameAsyncという形式をとる。<br>
タスクベース非同期パターン (Task-based Asynchronous Pattern: TAP) は、この新しいアプローチの中心となる概念である。<br>
そしてその戻り値を、Task、Task<T>、voidとし、Taskを待つには<code>await</code>キーワードを付加する。<br>
TAPでは、非同期メソッドの名前に<code>Async</code>というサフィックスを付けて、戻り値の型として<code>Task</code>、<code>Task<T></code>、<code>void</code>を使用する。<br>
また、<code>await</code>キーワードを付加した関数には、メソッドのシグネチャに<code>async</code>キーワードを付加する。<br>
<br>
<code>async</code>キーワードは、メソッドが非同期であることを示す。<br>
このキーワードを使用することにより、メソッド内で<code>await</code>キーワードを使用できるようになる。<br>
<code>await</code>は、非同期操作の完了を待機するために使用され、その間にスレッドをブロックすることなく、制御を呼び出し元に返す。<br>
<br>
以下の例では、MethodAsync1とMethodAsync2という2つの非同期メソッドが定義されている。<br>
これらのメソッドは、それぞれTask<int>型とTask<(bool, string)>型 (タプル型) を返す。<br>
<br>
これらのメソッド内では、Task.Runを使用して新しいタスクを開始し、Task.Delayで非同期の待機を模倣している。<br>
実際のアプリケーションでは、この部分が時間のかかる操作 (ファイルI/Oやネットワーク通信等) に置き換わることが多い。<br>
<br>
<br>
以下の例は、Task<int>型、Task<(bool, string)>型 (タプル型) を返す非同期関数である。<br>
  <syntaxhighlight lang="c#">
  <syntaxhighlight lang="c#">
  // Task<int>型を返す非同期関数
  // Task<int>型を返す非同期関数
32行目: 39行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
C#のマルチスレッドプログラミングのメリットは多岐にわたる。<br>
UIの応答性の向上、複数のCPUコアを効率的に利用、I/O操作を最適化すること等が可能である。<br>
<br>
しかし、マルチスレッドプログラミングには注意点もある。<br>
例えば、デッドロックやレースコンディション等の同期の問題に注意する必要がある。<br>
また、過度にスレッドを使用する場合、却ってパフォーマンスが低下する可能性もある。<br>
<br>
C#は、これらの課題に対処するための様々なツールを提供している。<br>
例えば、<code>lock</code>キーワード、<code>Monitor</code>クラス、<code>Interlocked</code>クラス等が存在する。<br>
また、より高度な並行処理のためには、Task Parallel Library (TPL)やParallel LINQ (PLINQ)等のライブラリも用意されている。<br>
<br>
マルチスレッドプログラミングは強力であるが、適切に使用することが重要である。<br>
シンプルな操作には同期プログラミング、複雑な非同期操作には<code>async</code> / <code>await</code>パターンを使用する等、状況に応じて適切なアプローチを選択することが、<br>
効率的で保守しやすいコードを記述するための鍵となる。<br>
<br><br>
<br><br>


案内メニュー