次の方法で共有


Thread.Abort メソッド (Object)

このメソッドが呼び出された対象のスレッドで、スレッドの終了プロセスを開始する ThreadAbortException を発生させます。またスレッドの終了に関する例外情報も提供します。このメソッドを呼び出すと、通常、スレッドが終了します。

Overloads Public Sub Abort( _
   ByVal stateInfo As Object _)
[C#]
public void Abort(objectstateInfo);
[C++]
public: void Abort(Object* stateInfo);
[JScript]
public function Abort(
   stateInfo : Object);

パラメータ

  • stateInfo
    中止するスレッドで使用できる、状態などのアプリケーション固有の情報を格納するオブジェクト。

例外

例外の種類 条件
SecurityException 呼び出し元に、必要なアクセス許可がありません。

解説

このメソッドをスレッド上で呼び出すと、スレッドで ThreadAbortException がスローされて、スレッドが中止します。 ThreadAbortException は、アプリケーション コードでキャッチできても ResetAbort を呼び出さない限り catch ブロックの末尾で再スローされる特殊な例外です。 ResetAbort は中止要求をキャンセルし、 ThreadAbortException によってスレッドが終了されるのを防ぎます。実行されていない finally ブロックは、スレッドが中止される前に実行されます。

メモ   スレッドが自身に対して Abort を呼び出した場合、その結果は例外をスローした場合と似ています。 ThreadAbortException がすぐに発生し、結果は予期できます。ただし、別のスレッドに対して Abort を呼び出した場合、この結果中断されるコードは予期できません。 finally ブロックの実行中にスレッドが中断されることも考えられます。この場合は finally ブロックが中断されます。また、静的なコンストラクタが中断される可能性もあります。まれにしか起こりませんが、これによって、そのアプリケーション ドメインでそのクラスのインスタンスの作成が中断されることもあります。

スレッドがすぐに確実に中止されるかどうかは保証できません。この状況は、アボート プロシージャの一部として呼び出される finally ブロックでスレッドが無制限に計算を実行した結果、無制限に中止が遅れる場合に発生することがあります。スレッドが中止したかどうかを確認するには、 Abort を呼び出した後にスレッドで Join メソッドを呼び出します。

起動していないスレッドで Abort が呼び出されると、 Start が呼び出されたときにスレッドは中止します。中断しているスレッドで Abort を呼び出すと、スレッドは再開してから中止します。ブロック状態またはスリープ状態のスレッドで Abort を呼び出すと、そのスレッドは中断してから中止します。アンマネージ コードの実行中にスレッドが ThreadAbortException を無視すると、スレッドがマネージ コードの実行を開始したときに ThreadAbortException が再スローされます。

Abort を同時に 2 回呼び出すと、1 回目の呼び出しで状態情報を設定し、もう 1 回の呼び出しで Abort を実行できます。ただし、アプリケーションはこの状態を区別できません。

スレッドで Abort を呼び出した後は、そのスレッドの状態には AbortRequested も含まれます。 Abort を正常に呼び出した結果スレッドが終了すると、スレッドの状態が Stopped に変更されます。十分なアクセス許可がある場合、 Abort の対象となるスレッドは、 ResetAbort メソッドを使用して中止をキャンセルできます。 ResetAbort メソッドの呼び出し例については、 ThreadAbortException クラスのトピックを参照してください。

使用例

[Visual Basic, C#, C++] 中止するスレッドに情報を渡す方法の例を次に示します。

 
Imports System
Imports System.Threading

Public Class Test

    Shared Sub Main()
        Dim newThread As New Thread(AddressOf TestMethod)
        newThread.Start()
        Thread.Sleep(1000)

        ' Abort newThread.
        Console.WriteLine("Main aborting new thread.")
        newThread.Abort("Information from Main.")

        ' Wait for the thread to terminate.
        newThread.Join()
        Console.WriteLine("New thread terminated - Main exiting.")
    End Sub

    Shared Sub TestMethod()
        Try
            While True
                Console.WriteLine("New thread running.")
                Thread.Sleep(1000)
            End While
        Catch abortException As ThreadAbortException
            Console.WriteLine( _
                CType(abortException.ExceptionState, String))
        End Try
    End Sub

End Class

[C#] 
using System;
using System.Threading;

class Test
{
    public static void Main()
    {
        Thread newThread  = new Thread(new ThreadStart(TestMethod));
        newThread.Start();
        Thread.Sleep(1000);

        // Abort newThread.
        Console.WriteLine("Main aborting new thread.");
        newThread.Abort("Information from Main.");

        // Wait for the thread to terminate.
        newThread.Join();
        Console.WriteLine("New thread terminated - Main exiting.");
    }

    static void TestMethod()
    {
        try
        {
            while(true)
            {
                Console.WriteLine("New thread running.");
                Thread.Sleep(1000);
            }
        }
        catch(ThreadAbortException abortException)
        {
            Console.WriteLine((string)abortException.ExceptionState);
        }
    }
}

[C++] 
#using <mscorlib.dll>
using namespace System;
using namespace System::Threading;

__gc class Test
{
    Test() {}
public:
    static void TestMethod()
    {
        try
        {
            while(true)
            {
                Console::WriteLine(S"New thread running.");
                Thread::Sleep(1000);
            }
        }
        catch(ThreadAbortException* abortException)
        {
            Console::WriteLine(dynamic_cast<String*>(
                abortException->ExceptionState));
        }
    }
};

    void main()
    {
        Thread* newThread = 
            new Thread(new ThreadStart(0, &Test::TestMethod));
        newThread->Start();
        Thread::Sleep(1000);

        // Abort newThread.
        Console::WriteLine(S"Main aborting new thread.");
        newThread->Abort(S"Information from main.");

        // Wait for the thread to terminate.
        newThread->Join();
        Console::WriteLine(S"New thread terminated - main exiting.");
    }

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, Common Language Infrastructure (CLI) Standard

.NET Framework セキュリティ:

参照

Thread クラス | Thread メンバ | System.Threading 名前空間 | Thread.Abort オーバーロードの一覧 | ThreadAbortException | Aborted | AbortRequested | スレッドおよびスレッド処理 | スレッドの使用とスレッド処理 | スレッドの破棄