次の方法で共有


スレッドの破棄

マネージ スレッドを完全に停止するには、Abort メソッドを使用します。Abort を呼び出すと、共通言語ランタイムが対象スレッドに ThreadAbortException をスローします。対象スレッドはこの例外をキャッチできます。詳細については、「System.Threading.Thread.Abort」を参照してください。

Noteメモ :

スレッドがアンマネージ コードを実行しているときに、その Abort メソッドが呼び出された場合、ランタイムはスレッドを System.Threading.ThreadState.AbortRequested とマークします。スレッドがマネージ コードに戻ると例外がスローされます。

スレッドは、一度アボートされると、再起動できません。

Abort メソッドを呼び出しても、対象スレッドは ThreadAbortException をキャッチし、finally ブロック内の任意の量のコードを実行できるため、すぐには中止されません。スレッドが終了するまで待機する必要がある場合は、System.Threading.Thread.Join を呼び出すことができます。System.Threading.Thread.Join はブロッキング呼び出しで、スレッドが実際に実行を停止するか、オプションのタイムアウト間隔が経過するまで制御が戻りません。中止されたスレッドは、ResetAbort メソッドを呼び出したり、finally ブロックで非バインド処理を実行したりする可能性があります。そのため、タイムアウトを指定していない場合、待機の終了は保証されません。

System.Threading.Thread.Join メソッドの呼び出しを待機しているスレッドは、System.Threading.Thread.Interrupt を呼び出す他のスレッドによって中断される可能性があります。

ThreadAbortException の処理

独自のコードから Abort を呼び出した結果、またはスレッドが動作しているアプリケーション ドメインをアンロード (System.AppDomain.Unload(System.AppDomain)System.Threading.Thread.Abort を使用してスレッドを終了します) した結果としてスレッドが中止されるようにする場合、スレッドは、次のコードに示すように ThreadAbortException を処理し、finally 句の最終処理を実行する必要があります。

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.

finally 句の末尾、または finally 句が存在しない場合は catch 句の末尾で、ThreadAbortException がシステムによって再スローされるため、catch 句または finally 句にクリーンアップ コードを配置する必要があります。

この例外をシステムが再スローしないようにするには、System.Threading.Thread.ResetAbort メソッドを呼び出します。ただし、この操作は、独自のコードが原因で ThreadAbortException が生成された場合に限定する必要があります。

参照

関連項目

ThreadAbortException
Thread

その他の技術情報

スレッドの使用とスレッド処理