C#
 Computer >> コンピューター >  >> プログラミング >> C#

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() を組み合わせることで、スレッドを無理やり中断させることなく、安全かつ確実に終了させることができます。スレッド制御を行う際は、ぜひこの手法を活用してください。

  1. C#で学ぶバブルソート:アルゴリズムの仕組みと実装コードをわかりやすく解説

    バブルソート(Bubble Sort)は、最も基本的なソートアルゴリズムの一つです。隣り合う要素同士を順番に比較し、順序が正しくなければ入れ替えるという操作を繰り返すことで、配列全体を整列させます。比較ベースのシンプルな手法であり、初心者がソートの考え方を理解するのに最適なアルゴリズムです。バブルソートの動作イメージここでは、次の5つの要素を持つint型配列を例に、バブルソートの手順を見ていきましょう。int[] arr = { 78, 55, 45, 98, 13 };1回目のパス(反復処理)まず、先頭の2つの要素「78」と「55」を比較します。55は78より小さいため、両者を入れ替えます。

  2. C#で現在のスレッドの状態(IsAlive)を確認する方法

    C#で現在実行中のスレッドの状態を確認するには、IsAlive プロパティを使用します。このプロパティは、スレッドが起動されており、まだ終了していない場合に True を返します。スレッド情報の取得まず、CurrentThread プロパティを使って、現在実行中のスレッドの情報を取得します。Thread thread = Thread.CurrentThread;次に、取得したスレッドオブジェクトに対して IsAlive プロパティを参照することで、スレッドの状態を確認できます。thread.IsAliveサンプルコード以下は、C#で現在のスレッドの状態を確認する完全なコード例です。スレッドに