スレッド処理の使用 (C# プログラミング ガイド)
更新 : 2007 年 11 月
既定では、C# プログラムは 1 つのスレッドを使用します。このスレッドは、Main メソッドで開始および終了するプログラム内のコードを実行します。Main によって直接または間接的に実行されるすべてのコマンドは、既定のスレッド、つまりプライマリ スレッドによって実行されます。このスレッドは、Main から制御が戻ると終了します。ただし、補助スレッドを作成して使用することで、プライマリ スレッドと並行してコードを実行することもできます。これらスレッドは、一般にワーカー スレッドと呼ばれます。
ワーカー スレッドを使用すると、時間がかかるタスクや速度が重視されるタスクを、プライマリ スレッドを停止せずに実行できます。たとえば、サーバー アプリケーションでは、前の要求が完了するまで待機せずに着信要求を処理できるように、ワーカー スレッドが使用されることがよくあります。ワーカー スレッドは、デスクトップ アプリケーションで "バックグラウンド" タスクを実行するためにも使用されます。これにより、ユーザー インターフェイス要素を駆動するメイン スレッドがユーザーの操作に応答し続けることができます。
マルチスレッド処理により、スループットと応答性の問題が解決されますが、デッドロックや競合状態など、リソース共有に関する問題の発生原因になることもあります。複数のスレッドは、ファイル ハンドルやネットワーク接続などのさまざまなリソースを必要とするタスクに最適です。複数のスレッドを単一のリソースに割り当てると、同期上の問題が発生する可能性があります。また、スレッドを頻繁にブロックしながら他のスレッドを待機するのは、複数のスレッドを使用する趣旨にそぐいません。
ワーカー スレッドは、他のスレッドによって使用されるリソースの多くを必要としない、時間がかかるタスクや速度が重視されるタスクを実行するために使用するのが一般的です。もちろん、プログラム内の一部のリソースには、複数のスレッドがアクセスする必要があります。そのために、System.Threading 名前空間には、スレッドの同期に必要なクラスが用意されています。これらのクラスは、Mutex、Monitor、Interlocked、AutoResetEvent、および ManualResetEvent です。
これらのクラスの一部またはすべてを使用して、複数のスレッドの動作を同期できますが、マルチスレッド処理は、C# 言語によっても一部サポートされます。たとえば、C# の Lock ステートメントは、Monitor を暗黙に使用して同期機能を実現します。
次のトピックでは、一般的なマルチスレッド処理の手法について説明します。
関連項目
詳細については、次のトピックを参照してください。