Thread.Abort メソッド ()
このメソッドが呼び出された対象のスレッドで、そのスレッドの終了プロセスを開始する ThreadAbortException を発生させます。このメソッドを呼び出すと、通常、スレッドが終了します。
Overloads Public Sub Abort()
[C#]
public void Abort();
[C++]
public: void Abort();
[JScript]
public function Abort();
例外
例外の種類 | 条件 |
---|---|
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++] Abort メソッドへの最初の呼び出しに応じてスレッドが ResetAbort メソッドを呼び出した場合、 Abort を再度呼び出すと、そのスレッドは finally ブロック内で終了するということを示す例を次に示します。 ResetAbort が呼び出されていない場合は、 Abort への 2 回目の呼び出しは無視されます。
Imports Microsoft.VisualBasic
Imports System
Imports System.Threading
Public Class Test
Shared Sub Main()
Dim firstThread As Thread = New Thread(AddressOf Test.TestMethod)
Dim secondThread As Thread = New Thread(AddressOf Test.TestMethod)
firstThread.Name = "First "
secondThread.Name = "Second"
firstThread.Start()
secondThread.Start()
Thread.Sleep(2000)
' Abort both threads.
Console.WriteLine(vbCrLf & "Main aborting both threads.")
firstThread.Abort()
secondThread.Abort()
Thread.Sleep(2000)
' Call Abort a second time if the threads have not aborted.
If (firstThread.ThreadState And _
(ThreadState.Aborted Or ThreadState.Stopped)) = 0 Then
Console.WriteLine(vbCrLf & "Main aborting first thread." & vbCrLf)
firstThread.Abort()
End If
If (secondThread.ThreadState And _
(ThreadState.Aborted Or ThreadState.Stopped)) = 0 Then
Console.WriteLine(vbCrLf & "Main aborting second thread." & vbCrLf)
secondThread.Abort()
End If
' Wait for the threads to terminate.
firstThread.Join()
Console.WriteLine(vbCrLf & "First thread terminated.")
If secondThread.Join(2000) Then
Console.WriteLine(vbCrLf & "Second thread terminated.")
Else
Console.WriteLine( _
vbCrLf & "Join timed out - second thread still running.")
End If
Console.WriteLine(vbCrLf & "Main exiting.")
End Sub
Shared Sub TestMethod()
Dim threadName As String = Thread.CurrentThread.Name
Try
While True
Console.WriteLine("{0} thread running.", threadName)
Thread.Sleep(1000)
End While
Catch ex As ThreadAbortException
' Only the first thread calls ResetAbort.
If(threadName = "First ") Then
Thread.ResetAbort()
Console.WriteLine(vbCrLf & "First thread calling ResetAbort.")
Else
Console.WriteLine(vbCrLf & "Second thread not calling ResetAbort.")
End If
Finally
While True
Console.WriteLine("{0} thread running in " & _
"Finally block.", threadName)
Thread.Sleep(1000)
End While
End Try
End Sub
End Class
[C#]
using System;
using System.Threading;
class Test
{
public static void Main()
{
Thread firstThread = new Thread(new ThreadStart(TestMethod));
Thread secondThread = new Thread(new ThreadStart(TestMethod));
firstThread.Name = "First ";
secondThread.Name = "Second";
firstThread.Start();
secondThread.Start();
Thread.Sleep(2000);
// Abort both threads.
Console.WriteLine("\nMain aborting both threads.");
firstThread.Abort();
secondThread.Abort();
Thread.Sleep(2000);
// Call Abort a second time if the threads have not aborted.
if((firstThread.ThreadState &
(ThreadState.Aborted | ThreadState.Stopped)) == 0)
{
Console.WriteLine("\nMain aborting first thread.\n");
firstThread.Abort();
}
if((secondThread.ThreadState &
(ThreadState.Aborted | ThreadState.Stopped)) == 0)
{
Console.WriteLine("\nMain aborting second thread.\n");
secondThread.Abort();
}
// Wait for the threads to terminate.
firstThread.Join();
Console.WriteLine("\nFirst thread terminated.");
if(secondThread.Join(2000))
{
Console.WriteLine("\nSecond thread terminated.");
}
else
{
Console.WriteLine(
"\nJoin timed out - second thread still running.");
}
Console.WriteLine("\nMain exiting.");
}
static void TestMethod()
{
string threadName = Thread.CurrentThread.Name;
try
{
while(true)
{
Console.WriteLine("{0} thread running.", threadName);
Thread.Sleep(1000);
}
}
catch(ThreadAbortException e)
{
// Only the first thread calls ResetAbort.
if(threadName == "First ")
{
Thread.ResetAbort();
}
Console.WriteLine("\n{0} thread {1}calling ResetAbort.",
threadName, threadName == "First " ? "" : "not ");
}
finally
{
while(true)
{
Console.WriteLine("{0} thread running in " +
"finally block.", threadName);
Thread.Sleep(1000);
}
}
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::Threading;
__gc class Test
{
Test() {}
public:
static void TestMethod()
{
String* threadName = Thread::CurrentThread->Name;
try
{
while(true)
{
Console::WriteLine(S"{0} thread running.",
threadName);
Thread::Sleep(1000);
}
}
catch(ThreadAbortException* e)
{
// Only the first thread calls ResetAbort.
if(threadName == S"First ")
{
Thread::ResetAbort();
}
Console::WriteLine(S"\n{0} thread {1}calling ResetAbort.",
threadName, threadName == S"First " ? S"" : S"not ");
}
__finally
{
while(true)
{
Console::WriteLine(S"{0} thread running in "
S"finally block.", threadName);
Thread::Sleep(1000);
}
}
}
};
void main()
{
Thread* firstThread =
new Thread(new ThreadStart(0, &Test::TestMethod));
Thread* secondThread =
new Thread(new ThreadStart(0, &Test::TestMethod));
firstThread->Name = S"First ";
secondThread->Name = S"Second";
firstThread->Start();
secondThread->Start();
Thread::Sleep(2000);
// Abort both threads.
Console::WriteLine(S"\nMain aborting both threads.");
firstThread->Abort();
secondThread->Abort();
Thread::Sleep(2000);
// Call Abort a second time if the threads have not aborted.
if((firstThread->ThreadState &
(ThreadState::Aborted | ThreadState::Stopped)) == 0)
{
Console::WriteLine(S"\nMain aborting first thread.\n");
firstThread->Abort();
}
if((secondThread->ThreadState &
(ThreadState::Aborted | ThreadState::Stopped)) == 0)
{
Console::WriteLine(S"\nMain aborting second thread.\n");
secondThread->Abort();
}
// Wait for the threads to terminate.
firstThread->Join();
Console::WriteLine(S"\nFirst thread terminated.");
if(secondThread->Join(2000))
{
Console::WriteLine(S"\nSecond thread terminated.");
}
else
{
Console::WriteLine(
S"\nJoin timed out - second thread still running.");
}
Console::WriteLine(S"\nMain 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 | スレッドおよびスレッド処理 | スレッドの使用とスレッド処理 | スレッドの破棄