ThreadAbortException Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Исключение, выдаваемое при вызове метода Abort(Object). Этот класс не наследуется.
public ref class ThreadAbortException sealed : SystemException
public sealed class ThreadAbortException : SystemException
[System.Serializable]
public sealed class ThreadAbortException : SystemException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ThreadAbortException : SystemException
type ThreadAbortException = class
inherit SystemException
[<System.Serializable>]
type ThreadAbortException = class
inherit SystemException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ThreadAbortException = class
inherit SystemException
Public NotInheritable Class ThreadAbortException
Inherits SystemException
- Наследование
- Атрибуты
Примеры
В следующем примере демонстрируется прерывание потока. Поток, получающий, ThreadAbortException
использует ResetAbort метод для отмены запроса на прерывание и продолжения выполнения.
using namespace System;
using namespace System::Threading;
using namespace System::Security::Permissions;
ref 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." );
Console::WriteLine( "Exception message: {0}", e->Message );
Thread::ResetAbort();
}
Console::WriteLine( "Thread - still alive and working." );
Thread::Sleep( 1000 );
Console::WriteLine( "Thread - finished working." );
}
};
int main()
{
ThreadStart^ myThreadDelegate = gcnew ThreadStart( ThreadWork::DoWork );
Thread^ myThread = gcnew Thread( myThreadDelegate );
myThread->Start();
Thread::Sleep( 100 );
Console::WriteLine( "Main - aborting my thread." );
myThread->Abort();
myThread->Join();
Console::WriteLine( "Main ending." );
}
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.");
Console.WriteLine("Exception message: {0}", e.Message);
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.");
}
}
Imports System.Threading
Imports System.Security.Permissions
Public Class ThreadWork
Public Shared Sub DoWork()
Try
Dim i As Integer
For i = 0 To 99
Console.WriteLine("Thread - working.")
Thread.Sleep(100)
Next i
Catch e As ThreadAbortException
Console.WriteLine("Thread - caught ThreadAbortException - resetting.")
Console.WriteLine("Exception message: {0}", e.Message)
Thread.ResetAbort()
End Try
Console.WriteLine("Thread - still alive and working.")
Thread.Sleep(1000)
Console.WriteLine("Thread - finished working.")
End Sub
End Class
Class ThreadAbortTest
Public Shared Sub Main()
Dim myThreadDelegate As New ThreadStart(AddressOf ThreadWork.DoWork)
Dim myThread As New Thread(myThreadDelegate)
myThread.Start()
Thread.Sleep(100)
Console.WriteLine("Main - aborting my thread.")
myThread.Abort()
myThread.Join()
Console.WriteLine("Main ending.")
End Sub
End Class
Этот код выводит следующие результаты:
Thread - working.
Main - aborting my thread.
Thread - caught ThreadAbortException - resetting.
Exception message: Thread was being aborted.
Thread - still alive and working.
Thread - finished working.
Main ending.
Комментарии
При вызове Abort метода для уничтожения потока среда CLR создает исключение ThreadAbortException . ThreadAbortException — специальное исключение, которое можно перехватить, но оно будет автоматически создано в конце catch
блока. При возникновении этого исключения среда выполнения выполняет все finally
блоки до завершения потока. Так как поток может выполнять неограниченные вычисления в finally
блоках или вызывать Thread.ResetAbort для отмены прерывания, нет никакой гарантии, что поток закончится. Если вы хотите дождаться завершения прерванного потока, можно вызвать Thread.Join метод. Join — Это блокирующий вызов, который не возвращает результат, пока поток не прекратит выполнение.
Только для .NET Core: Несмотря на то, что этот тип существует в .NET Core, так как Abort не поддерживается, среда CLR никогда не будет вызываться ThreadAbortException .
Примечание
Когда среда CLR останавливает фоновые потоки после завершения всех передних потоков управляемого исполняемого файла, он не использует Thread.Abort . Таким образом, нельзя использовать ThreadAbortException для обнаружения завершения фоновых потоков средой CLR.
ThreadAbortException использует COR_E_THREADABORTED HRESULT, имеющий значение 0x80131530.
Примечание
Значение унаследованного Data свойства всегда равно null
.
Свойства
Data |
Возвращает коллекцию пар «ключ-значение», предоставляющую дополнительные сведения об исключении. (Унаследовано от Exception) |
ExceptionState |
Возвращает объект, содержащий зависящую от приложения информацию, относящуюся к аварийному завершению работы процесса. |
HelpLink |
Получает или задает ссылку на файл справки, связанный с этим исключением. (Унаследовано от Exception) |
HResult |
Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению. (Унаследовано от Exception) |
InnerException |
Возвращает экземпляр класса Exception, который вызвал текущее исключение. (Унаследовано от Exception) |
Message |
Возвращает сообщение, описывающее текущее исключение. (Унаследовано от Exception) |
Source |
Возвращает или задает имя приложения или объекта, вызывавшего ошибку. (Унаследовано от Exception) |
StackTrace |
Получает строковое представление непосредственных кадров в стеке вызова. (Унаследовано от Exception) |
TargetSite |
Возвращает метод, создавший текущее исключение. (Унаследовано от Exception) |
Методы
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
GetBaseException() |
При переопределении в производном классе возвращает исключение Exception, которое является первопричиной одного или нескольких последующих исключений. (Унаследовано от Exception) |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetObjectData(SerializationInfo, StreamingContext) |
При переопределении в производном классе задает объект SerializationInfo со сведениями об исключении. (Унаследовано от Exception) |
GetType() |
Возвращает тип среды выполнения текущего экземпляра. (Унаследовано от Exception) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ToString() |
Создает и возвращает строковое представление текущего исключения. (Унаследовано от Exception) |
События
SerializeObjectState |
Является устаревшей.
Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении. (Унаследовано от Exception) |