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

C#におけるスレッドの中止(Abort)方法をわかりやすく解説

Abort()メソッドは、実行中のスレッドを強制的に終了(破棄)するために使用されるメソッドです。

このメソッドが呼び出されると、ランタイムはThreadAbortExceptionという例外をスローすることで対象のスレッドを中止させます。特徴的なのは、この例外が通常のcatchブロックでは捕捉できない点です。制御は最終的にfinallyブロック(存在する場合)へと移行します。

スレッドを中止する際は、以下のように対象のスレッドに対してAbort()メソッドを呼び出します。

childThread.Abort();

注意:最新の.NET環境での扱い

Thread.Abort()は.NET Frameworkでは利用可能ですが、.NET Core以降(.NET 5/6/7/8)では非推奨となっており、呼び出すとPlatformNotSupportedExceptionがスローされます。現代的なアプリケーション開発では、CancellationTokenなどによる協調的なキャンセル処理を使うことが推奨されています。

サンプルコード

using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
       public static void CallToChildThread() {
           try {
               Console.WriteLine("Child thread starts");

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

               Console.WriteLine("Child Thread Completed");
           } catch (ThreadAbortException e) {
               Console.WriteLine("Thread Abort Exception");
           } finally {
               Console.WriteLine("Couldn't catch the Thread Exception");
           }
       }

       static void Main(string[] args) {
           ThreadStart childref = new ThreadStart(CallToChildThread);
           Console.WriteLine("In Main: Creating the Child thread");

           Thread childThread = new Thread(childref);
           childThread.Start();

           // メインスレッドをしばらく停止させる
           Thread.Sleep(5000);

           // 子スレッドを中止する
           Console.WriteLine("In Main: Aborting the Child thread");

           childThread.Abort();
           Console.ReadKey();
       }
   }
}

コードのポイント

  • 子スレッドは500ミリ秒間隔で0から10までカウントアップを行います。
  • メインスレッドは5秒待機した後、子スレッドのAbort()を呼び出します。
  • この時点で子スレッドは8までしか表示しておらず、途中で強制終了されていることが分かります。
  • catchブロックでThreadAbortExceptionを受け取った後も、必ずfinallyブロックが実行されます。

実行結果

In Main: Creating the Child thread
Child thread starts
0
1
2
3
4
5
6
7
8
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception

まとめ

Abort()メソッドはスレッドを強制終了できる便利な手段ですが、例外ベースであるためリソースの後処理やデータ整合性の面でリスクを伴います。finallyブロックでのクリーンアップ処理を必ず記述すること、そして新しいプロジェクトではCancellationTokenによる安全なキャンセル設計を検討することが重要です。

  1. C#でスレッドの優先度を表示する方法|Priorityプロパティの使い方

    C#でスレッドの優先度を表示するには C#でスレッドの優先度を確認するには、Priorityプロパティを使用します。このプロパティは、OSがスレッドをどの程度の優先順位でスケジューリングするかを示す値を返します。 まず、CurrentThreadプロパティを使って、現在実行中のスレッドの情報を取得します。 Thread thread = Thread.CurrentThread; 次に、thread.Priorityプロパティを参照することで、そのスレッドの優先度を表示できます。 thread.Priority サンプルコード C#でスレッドの優先度を表示する完全なコード例を見てみましょう。

  2. Javaのスレッドプールとは?仕組みと実装例をわかりやすく解説

    スレッドプールとはスレッドプール(Thread Pool)とは、あらかじめ初期化された複数のスレッドをまとめて管理する仕組みのことです。基本的な考え方は、アプリケーションの起動時に一定数のスレッドを作成してプールに入れておき、それらのスレッドが仕事を待機するというものです。サーバーがリクエストを受け取ると、利用可能なスレッドがあればプールから1つ取り出して処理を任せます。スレッドはタスクの完了後、破棄されることなくプールへ戻り、次の仕事を待ちます。もしプール内に空きスレッドが存在しない場合は、空きができるまでサーバー側で待機することになります。スレッドプールのメリットタスクごとに新しいスレッド