スレッドの使用とスレッド処理
.NET では、複数の操作を同時に実行するアプリケーションを記述できます。 他の操作を止める可能性がある操作は個別のスレッドで実行できます。これはマルチスレッドやフリー スレッドと呼ばれているプロセスです。
マルチスレッドを利用するアプリケーションはユーザーの入力に対する応答性が良くなります。プロセッサを集中的に利用するタスクが個別のスレッドで実行されるため、ユーザー インターフェイスの動作が妨げられません。 マルチスレッドはまた、スケーラブルなアプリケーションの開発にも便利です。ワークロードが増えたとき、スレッドを追加できるからです。
注意
アプリケーションのスレッドの動作をさらに細かく制御するには、スレッドを自分で管理します。 ただし、System.Threading.Tasks.Parallel および System.Threading.Tasks.Task クラス、Parallel LINQ (PLINQ)、System.Collections.Concurrent 名前空間の同時実行コレクション クラス、スレッドではなくタスクの概念に基づくプログラミング モデルによって、マルチスレッド プログラミングが大幅に簡略化されています。 詳細については、「.NET での並列プログラミング」と「タスク並列ライブラリ (TPL)」を参照してください。
方法: 新しいスレッドを作成して開始する
新しいスレッドを作成するには、System.Threading.Thread クラスの新しいインスタンスを作成します。 コンストラクターに対して新しいスレッドで実行するメソッド名を指定します。 作成したスレッドを開始するには、Thread.Start メソッドを呼び出します。 詳細と例については、「スレッドを作成し、開始時にデータを渡す」の記事と Thread API リファレンスを参照してください。
方法: スレッドを停止する
スレッドの実行を終了するには、System.Threading.CancellationToken を使用します。 これにより、統一された方法で協調的にスレッドを停止することができます。 詳細については、「マネージド スレッドのキャンセル」を参照してください。
協調的なキャンセルを行うように設計されていないサード パーティのコードがスレッドで実行されているために、スレッドを協調的に停止できない場合があります。 この場合は、その実行を強制的に終了することができます。 スレッドの実行を強制的に終了する場合、.NET Framework では Thread.Abort メソッドを使用できます。 このメソッドでは、呼び出されたスレッド上で ThreadAbortException が生成されます。 詳細については、「スレッドの破棄」を参照してください。 Thread.Abort メソッドは、.NET Core ではサポートされていません。 .NET Core でサード パーティのコードの実行を強制的に終了する必要がある場合は、それを別のプロセスで実行し、Process.Kill メソッドを使用します。
.NET Framework 4 よりも前では、System.Threading.CancellationToken は使用できません。 以前の .NET Framework バージョンでスレッドを停止するには、スレッド同期の手法を使用して、協調的なキャンセルを手動で実装します。 たとえば、volatile bool 型のフィールド shouldStop
を作成し、それを使ってスレッドで実行されるコードの停止を要求することができます。 詳細については、C# リファレンスの volatile に関する記事と、System.Threading.Volatile に関する記事をご覧ください。
Thread.Join メソッドを使用すると、停止させるスレッドが終了するまで、呼び出し元のスレッドを待機させることができます。
方法: スレッドを一時停止または中断する
Thread.Sleep メソッドを使用して、現在のスレッドを指定した時間一時停止します。 Thread.Interrupt メソッドを呼び出すことによって、ブロックされたスレッドを中断できます。 詳細については、「スレッドの一時中断と再開」を参照してください。
スレッド プロパティ
Thread プロパティの一部を次の表に示します。
プロパティ | 説明 |
---|---|
IsAlive | スレッドが起動していて、正常終了しておらず中止されてもいない場合は、true が返されます。 |
IsBackground | スレッドがバックグラウンド スレッドかどうかを示すブール値を取得または設定します。 バックグラウンド スレッドはフォアグラウンド スレッドに似ています。 ただし、バックグラウンド スレッドがプロセスの停止を防ぐことはありません。 あるプロセスに属するフォアグラウンド スレッドがすべて停止すると、共通言語ランタイムは、アライブ状態のバックグラウンド スレッドで Abort メソッドを呼び出し、プロセスを終了します。 詳細については、「フォアグラウンド スレッドとバックグラウンド スレッド」を参照してください。 |
Name | スレッドの名前を取得または設定します。 デバッグ時、個々のスレッドを検出するために頻繁に使用されます。 |
Priority | オペレーティング システムがスレッド スケジュールに優先順位を設定するために使用する ThreadPriority 値を取得または設定します。 詳細については、「スレッドのスケジューリング」と ThreadPriority リファレンスを参照してください。 |
ThreadState | スレッドの現在の状態を示す ThreadState 値を取得します。 |
関連項目
.NET