The exception that is thrown when a call is made to the Thread.Abort(object) method. This class cannot be inherited.
See Also: ThreadAbortException Members
When a call is made to the Thread.Abort(object) method to destroy a thread, the common language runtime throws a System.Threading.ThreadAbortException. System.Threading.ThreadAbortException is a special exception that can be caught, but it will automatically be raised again at the end of the catch block. When this exception is raised, the runtime executes all the finally blocks before ending the thread. Because the thread can do an unbounded computation in the finally blocks or call Thread.ResetAbort to cancel the abort, there is no guarantee that the thread will ever end. If you want to wait until the aborted thread has ended, you can call the Thread.Join method. Thread.Join is a blocking call that does not return until the thread actually stops executing.
When the common language runtime (CLR) stops background threads after all foreground threads in a managed executable have ended, it does not use erload:System.Threading.Thread.Abort. Therefore, you cannot use System.Threading.ThreadAbortException to detect when background threads are being terminated by the CLR.
System.Threading.ThreadAbortException uses the HRESULT COR_E_THREADABORTED, which has the value 0x80131530.
The value of the inherited Exception.Data property is always null.
The following example demonstrates aborting a thread. The thread that receives the System.Threading.ThreadAbortException uses the Thread.ResetAbort method to cancel the abort request and continue executing.
C# Example
using System; using System.Threading; using System.Security.Permissions; public class ThreadWork { public static void DoWork() { try { for (int i=0; i<100; i++) { Console.WriteLine("Thread - working."); Thread.Sleep(100); } } catch (ThreadAbortException e) { Console.WriteLine("Thread - caught ThreadAbortException - resetting."); Thread.ResetAbort(); } Console.WriteLine("Thread - still alive and working."); Thread.Sleep(1000); Console.WriteLine("Thread - finished working."); } } class ThreadAbortTest{ public static void Main() { ThreadStart myThreadDelegate = new ThreadStart(ThreadWork.DoWork); Thread myThread = new Thread(myThreadDelegate); myThread.Start(); Thread.Sleep(100); Console.WriteLine("Main - aborting my thread."); myThread.Abort(); myThread.Join(); Console.WriteLine("Main ending."); } }
The output is
Thread - working.