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

C#でスレッドを破棄するには?Thread.Abort()メソッドの使い方と注意点

C#では、Abort()メソッドを使用することで、実行中のスレッドを強制的に破棄(中止)できます。このメソッドが呼び出されると、共通言語ランタイムは対象のスレッドに対してThreadAbortException例外をスローし、スレッドを終了させます。

この例外はcatchブロックで捕捉しても自動的に再スローされるため、結果としてスレッドは停止します。ただしfinallyブロックが存在する場合は、そのブロック内の処理は必ず実行されるという特徴があります。

サンプルコード

以下は、子スレッドを作成し、途中で破棄する例です。

using System;
using System.Threading;

namespace MultithreadingApplication {
    class ThreadCreationProgram {
        public static void CallToChildThread() {
            try {
                Console.WriteLine("子スレッド開始");

                // 何らかの処理を行う(例:0から10までカウント)
                for (int counter = 0; counter <= 10; counter++) {
                    Thread.Sleep(500);
                    Console.WriteLine(counter);
                }

                Console.WriteLine("子スレッド完了");
            } catch (ThreadAbortException e) {
                Console.WriteLine("スレッド中断例外");
            } finally {
                Console.WriteLine("スレッド例外を捕捉できませんでした");
            }
        }

        static void Main(string[] args) {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("Main:子スレッドを作成中");

            Thread childThread = new Thread(childref);
            childThread.Start();
            // メインスレッドを一時的に停止
            Thread.Sleep(2000);
            // 子スレッドを中断
            Console.WriteLine("Main:子スレッドを中断します");
            childThread.Abort();
            Console.ReadKey();
        }
    }
}

実行結果

Main:子スレッドを作成中
子スレッド開始
0
1
2
Main:子スレッドを中断します
スレッド中断例外
スレッド例外を捕捉できませんでした

コードのポイント

  • Mainメソッド内でThreadStartデリゲートを使って子スレッドを生成し、Start()で開始しています。
  • メインスレッドは2秒間待機した後、Abort()を呼び出して子スレッドを強制中断します。
  • 子スレッド側ではtry-catch-finally構文により、ThreadAbortException発生時の処理と、必ず実行されるfinallyブロックの挙動を確認できます。

実行結果を見ると、カウントが「2」まで進んだ時点でAbort()が呼ばれ、その後catchブロックとfinallyブロックのメッセージが出力されていることが分かります。

注意点:モダンな.NET環境では利用不可

Abort()メソッドは.NET Frameworkでは利用できますが、.NET Coreおよび.NET 5以降ではPlatformNotSupportedExceptionがスローされ、使用できません。また、.NET Frameworkにおいても、リソースの不整合やデッドロックを引き起こす危険性があるため、安全な手法とはみなされていません。

現在のC#開発では、CancellationTokenを活用した協調的なキャンセル処理や、volatileなフラグ変数による終了制御など、スレッド自身に安全な終了タイミングを委ねる設計がベストプラクティスとされています。新規プロジェクトでは、これらの代替手段を採用することをおすすめします。

  1. Androidでスレッドを作成する方法を徹底解説!初心者向けサンプルコード付き

    Androidにおけるスレッドとは?スレッドとは、軽量なサブプロセスのことであり、UI(ユーザーインターフェース)を中断させることなくバックグラウンド処理を実行するために使用されます。Androidアプリ開発では、時間のかかる処理をメインスレッドから切り離すことで、アプリの応答性や操作性を維持することができます。本記事では、実際のサンプルコードを交えながら、Androidでスレッドを作成する方法をステップごとに分かりやすく解説します。手順1:Android Studioで新規プロジェクトを作成するまず、Android Studioを起動し、メニューから「File」→「New Project」を

  2. Rubyスレッドの使い方を徹底解説!初心者向けわかりやすいチュートリアル

    Rubyにおけるスレッド(Thread)とは、プログラムの中で複数の処理を同時に実行するための仕組みです。スレッドを活用すれば、Rubyプログラムは複数のタスクを並行してこなせるようになり、全体の処理速度向上が期待できます。 具体的には、次のような場面で役立ちます。 複数のファイルを同時に読み込む 複数のWebリクエストを同時に処理する 複数のAPIへ同時に接続する スレッドを使ったプログラムは「マルチスレッド」と呼ばれ、作業をより速く完了できるようになります。 ただし、注意点がひとつあります。 MRI(Matzs Ruby Interpreter)と呼ばれる標準のRuby処理系では、I/