スレッドの破棄Destroying threads

マネージド スレッドを完全に停止するには、Thread.Abort メソッドを使用します。The Thread.Abort method is used to stop a managed thread permanently. Abort を呼び出すと、共通言語ランタイムが対象スレッドで ThreadAbortException をスローし、対象スレッドはそれをキャッチできます。When you call Abort, the common language runtime throws a ThreadAbortException in the target thread, which the target thread can catch. 詳細については、「Thread.Abort」を参照してください。For more information, see Thread.Abort.

注意

スレッドが Abort メソッドの呼び出し時にアンマネージ コードを実行する場合、ランタイムはそれを ThreadState.AbortRequested としてマークします。If a thread is executing unmanaged code when its Abort method is called, the runtime marks it ThreadState.AbortRequested. スレッドがマネージド コードに戻ると、例外がスローされます。The exception is thrown when the thread returns to managed code.

スレッドが中止されると、再起動することはできません。Once a thread is aborted, it cannot be restarted.

対象スレッドが ThreadAbortException をキャッチし、finally ブロック内の任意の量のコードを実行できるため、Abort メソッドにより、スレッドがすぐに中止されることはありません。The Abort method does not cause the thread to abort immediately, because the target thread can catch the ThreadAbortException and execute arbitrary amounts of code in a finally block. スレッドが終了するまで待機する必要がある場合は、Thread.Join を呼び出すことができます。You can call Thread.Join if you need to wait until the thread has ended. Thread.Join は、スレッドが実際に実行を停止するか、オプションのタイムアウト間隔が経過するまで返されないブロック呼び出しです。Thread.Join is a blocking call that does not return until the thread has actually stopped executing or an optional timeout interval has elapsed. 中止されたスレッドは ResetAbort メソッドを呼び出したり、finally ブロックで無制限処理を実行したりすることができるため、タイムアウトを指定しない場合、終了するまで待機するとは限りません。The aborted thread could call the ResetAbort method or perform unbounded processing in a finally block, so if you do not specify a timeout, the wait is not guaranteed to end.

Thread.Join メソッドへの呼び出しを待機しているスレッドは、Thread.Interrupt を呼び出す他のスレッドで中断することができます。Threads that are waiting on a call to the Thread.Join method can be interrupted by other threads that call Thread.Interrupt.

ThreadAbortException の処理Handling ThreadAbortException

独自のコードからの Abort の呼び出しの結果、またはスレッドが実行中のアプリケーション ドメインのアンロード (AppDomain.UnloadThread.Abort を使用してスレッドを終了する) の結果として、スレッドが中止されることが予想される場合、スレッドは ThreadAbortException を処理し、以下のコードに示すように、finally 句で最終処理を実行する必要があります。If you expect your thread to be aborted, either as a result of calling Abort from your own code or as a result of unloading an application domain in which the thread is running (AppDomain.Unload uses Thread.Abort to terminate threads), your thread must handle the ThreadAbortException and perform any final processing in a finally clause, as shown in the following code.

Try  
    ' Code that is executing when the thread is aborted.  
Catch ex As ThreadAbortException  
    ' Clean-up code can go here.  
    ' If there is no Finally clause, ThreadAbortException is  
    ' re-thrown by the system at the end of the Catch clause.   
Finally  
    ' Clean-up code can go here.  
End Try  
' Do not put clean-up code here, because the exception   
' is rethrown at the end of the Finally clause.  
try   
{  
    // Code that is executing when the thread is aborted.  
}   
catch (ThreadAbortException ex)   
{  
    // Clean-up code can go here.  
    // If there is no Finally clause, ThreadAbortException is  
    // re-thrown by the system at the end of the Catch clause.   
}  
// Do not put clean-up code here, because the exception   
// is rethrown at the end of the Finally clause.  

クリーンアップ コードは catch 句または finally 句にある必要があります。これは、ThreadAbortExceptionfinally 句の最後、または catch 句の最後 (finally 句がない場合) にシステムによって再スローされるためです。Your clean-up code must be in the catch clause or the finally clause, because a ThreadAbortException is rethrown by the system at the end of the finally clause, or at the end of the catch clause if there is no finally clause.

Thread.ResetAbort メソッドを呼び出して、システムが例外を再スローしないようにすることができます。You can prevent the system from rethrowing the exception by calling the Thread.ResetAbort method. ただし、この操作は独自のコードにより ThreadAbortException が発生した場合にのみ行ってください。However, you should do this only if your own code caused the ThreadAbortException.

関連項目See also