C#でスレッドを強制終了する方法|フラグ変数を使った安全な終了手法
C#で実行中のスレッドを終了させたい場合、かつては Thread.Abort() メソッドが使われていましたが、現在は非推奨となっています(.NET Core 以降ではサポートされていません)。代わりに、bool型のフラグ変数を活用して、スレッドの処理を安全に停止させる方法が一般的です。
この記事では、フラグ変数と Thread.Join() を組み合わせて、実行中のスレッドを確実に終了させる方法をサンプルコード付きで解説します。
1. スレッドを作成して開始する
まず、新しいスレッドを作成し、開始します。
// 新しいスレッドを作成
Thread thread = new Thread(c.display);
thread.Start();
2. スレッドを停止するメソッドを用意する
次に、スレッドで実行する処理と、それを停止させるためのメソッドを定義します。while ループの継続条件にフラグ変数を使用し、Stop() メソッドが呼び出されたタイミングでフラグを true に切り替えることで、ループを抜けてスレッドが自然に終了する仕組みです。
public void display() {
while (!flag) {
Console.WriteLine("It's Working");
Thread.Sleep(2000);
}
}
public void Stop() {
flag = true;
}
サンプルコード全体
以下は、C#でスレッドを終了させる方法を学ぶための完全なコード例です。
using System;
using System.Threading.Tasks;
using System.Threading;
class Demo {
static void Main(string[] args) {
MyClass c = new MyClass();
// 新しいスレッドを作成して開始
Thread thread = new Thread(c.display);
thread.Start();
Console.WriteLine("Press any key to exit!");
Console.ReadKey();
// フラグを立ててスレッドを停止
c.Stop();
// スレッドの完全な終了を待機
thread.Join();
}
}
public class MyClass {
private bool flag = false;
public void display() {
while (!flag) {
Console.WriteLine("It's Working");
Thread.Sleep(2000);
}
}
public void Stop() {
flag = true;
}
}
出力結果
It's Working
Press any key to exit!
解説のポイント
- flag 変数: while ループの継続条件として機能します。
Stop()が呼ばれるとtrueになり、ループが終了してスレッドが停止します。 - Thread.Join(): メインスレッドが、対象スレッドの完全な終了を待機するために使用します。これにより、処理の取り残しやリソースの解放漏れを防ぐことができます。
- volatile キーワード: マルチスレッド環境でフラグの可視性を確実に保証したい場合は、
private volatile bool flag = false;のように宣言すると、より安全なコードになります。
このように、フラグ変数と Join() を組み合わせることで、スレッドを無理やり中断させることなく、安全かつ確実に終了させることができます。スレッド制御を行う際は、ぜひこの手法を活用してください。
-
C#で学ぶバブルソート:アルゴリズムの仕組みと実装コードをわかりやすく解説
バブルソート(Bubble Sort)は、最も基本的なソートアルゴリズムの一つです。隣り合う要素同士を順番に比較し、順序が正しくなければ入れ替えるという操作を繰り返すことで、配列全体を整列させます。比較ベースのシンプルな手法であり、初心者がソートの考え方を理解するのに最適なアルゴリズムです。バブルソートの動作イメージここでは、次の5つの要素を持つint型配列を例に、バブルソートの手順を見ていきましょう。int[] arr = { 78, 55, 45, 98, 13 };1回目のパス(反復処理)まず、先頭の2つの要素「78」と「55」を比較します。55は78より小さいため、両者を入れ替えます。
-
C#で現在のスレッドの状態(IsAlive)を確認する方法
C#で現在実行中のスレッドの状態を確認するには、IsAlive プロパティを使用します。このプロパティは、スレッドが起動されており、まだ終了していない場合に True を返します。スレッド情報の取得まず、CurrentThread プロパティを使って、現在実行中のスレッドの情報を取得します。Thread thread = Thread.CurrentThread;次に、取得したスレッドオブジェクトに対して IsAlive プロパティを参照することで、スレッドの状態を確認できます。thread.IsAliveサンプルコード以下は、C#で現在のスレッドの状態を確認する完全なコード例です。スレッドに