通过


Thread.Abort 方法

定义

在调用线程的线程中引发一个 ThreadAbortException ,以开始终止线程的过程。 调用此方法通常会终止线程。

重载

名称 说明
Abort()
已过时.

在调用线程的线程中引发一个 ThreadAbortException ,以开始终止线程的过程。 调用此方法通常会终止线程。

Abort(Object)
已过时.

在调用线程的线程中引发一个 ThreadAbortException ,以开始终止线程的过程,同时提供有关线程终止的异常信息。 调用此方法通常会终止线程。

注解

重要

Thread.Abort请谨慎使用该方法。 特别是当你调用它以中止当前线程以外的线程时,你不知道在引发代码时 ThreadAbortException 执行了哪些代码或未能执行。 你也不能确定应用程序的状态,也不能确定它负责保留的任何应用程序和用户状态。 例如,调用 Thread.Abort 可能会阻止执行静态构造函数或释放托管或非托管资源。

Abort()

Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs

注意

Thread.Abort is not supported and throws PlatformNotSupportedException.

在调用线程的线程中引发一个 ThreadAbortException ,以开始终止线程的过程。 调用此方法通常会终止线程。

public:
 void Abort();
[System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public void Abort();
public void Abort();
[<System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
member this.Abort : unit -> unit
member this.Abort : unit -> unit
Public Sub Abort ()
属性

例外

仅限 .NET Core 和 .NET 5+ :在所有情况下。

调用方没有所需的权限。

正在中止的线程当前处于挂起状态。

注解

此方法已过时。 在 .NET 5 及更高版本中,调用此方法将生成编译时警告。 此方法在 .NET 5 及更高版本和 .NET Core 上的运行时引发 PlatformNotSupportedException

在线程上调用此方法时,系统会在线程中引发中止 ThreadAbortException 该方法。 ThreadAbortException 是应用程序代码可以捕获的特殊异常,但在块末尾 catch 重新引发,除非 ResetAbort 被调用。 ResetAbort 取消中止请求,并阻止 ThreadAbortException 终止线程。 在中止线程之前执行未执行的 finally 块。

注释

当线程本身调用 Abort 时,效果类似于引发异常; ThreadAbortException 立即发生,结果可预测。 但是,如果一个线程在另一个线程上调用 Abort ,中止会中断正在运行的任何代码。 还可以中止静态构造函数。 在极少数情况下,这可能会阻止在该应用程序域中创建该类的实例。

不保证线程立即中止或完全中止。 如果线程在作为中止过程的一部分调用的块中 finally 执行无限的计算量,从而无限期地延迟中止,则可能会出现这种情况。 若要等待线程中止,可以在调用该方法后在线程上调用JoinAbort该方法,但不能保证等待将结束。

注释

如果中止的线程位于代码的受保护区域(如catch块、finally块或约束执行区域),则调用Abort的线程可能会阻止。 如果调用 Abort 的线程持有中止线程所需的锁,则可能会出现死锁。

如果在 Abort 尚未启动的线程上调用,则调用该线程时 Start 将中止。 如果在 Abort 被阻止或正在休眠的线程上调用,则线程将被中断,然后中止。

如果在Abort已挂起的线程上调用,则会在调用Abort的线程中引发一个ThreadStateException,并将其AbortRequested添加到ThreadState正在中止的线程的属性中。 在调用之前Resume,不会在挂起的线程中引发 AThreadAbortException

如果在 Abort 托管线程执行非托管代码时在托管线程上调用, ThreadAbortException 则在线程返回到托管代码之前不会引发 a。

如果同时发出两个调用 Abort ,则一个调用可以设置状态信息,另一个调用可以执行该 Abort调用。 但是,应用程序无法检测到这种情况。

在线程上调用后 Abort ,线程的状态包括 AbortRequested。 由于成功调用 Abort线程而终止线程后,线程的状态将更改为 Stopped。 具有足够的权限,作为目标 Abort 线程可以使用该方法取消中止 ResetAbort 。 有关演示如何调用 ResetAbort 该方法的示例,请参阅类 ThreadAbortException

另请参阅

适用于

Abort(Object)

Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs

注意

Thread.Abort is not supported and throws PlatformNotSupportedException.

在调用线程的线程中引发一个 ThreadAbortException ,以开始终止线程的过程,同时提供有关线程终止的异常信息。 调用此方法通常会终止线程。

public:
 void Abort(System::Object ^ stateInfo);
[System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public void Abort(object? stateInfo);
public void Abort(object stateInfo);
public void Abort(object? stateInfo);
[<System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
member this.Abort : obj -> unit
member this.Abort : obj -> unit
Public Sub Abort (stateInfo As Object)

参数

stateInfo
Object

一个对象,其中包含特定于应用程序的信息,例如状态,该状态可由中止的线程使用。

属性

例外

仅限 .NET Core 和 .NET 5+ :在所有情况下。

调用方没有所需的权限。

正在中止的线程当前处于挂起状态。

示例

下面的代码示例演示如何将信息传递给正在中止的线程。

using System;
using System.Threading;

class Test
{
    public static void Main()
    {
        Thread newThread  = new Thread(new ThreadStart(TestMethod));
        newThread.Start();
        Thread.Sleep(1000);

        // Abort newThread.
        Console.WriteLine("Main aborting new thread.");
        newThread.Abort("Information from Main.");

        // Wait for the thread to terminate.
        newThread.Join();
        Console.WriteLine("New thread terminated - Main exiting.");
    }

    static void TestMethod()
    {
        try
        {
            while(true)
            {
                Console.WriteLine("New thread running.");
                Thread.Sleep(1000);
            }
        }
        catch(ThreadAbortException abortException)
        {
            Console.WriteLine((string)abortException.ExceptionState);
        }
    }
}
open System.Threading

let testMethod () =
    try
        while true do
            printfn "New thread running."
            Thread.Sleep 1000
    with :? ThreadAbortException as abortException ->
        printfn $"{abortException.ExceptionState :?> string}"

let newThread = Thread testMethod
newThread.Start()
Thread.Sleep 1000

// Abort newThread.
printfn "Main aborting new thread."
newThread.Abort "Information from Main."

// Wait for the thread to terminate.
newThread.Join()
printfn "New thread terminated - Main exiting."
Imports System.Threading

Public Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim newThread As New Thread(AddressOf TestMethod)
        newThread.Start()
        Thread.Sleep(1000)

        ' Abort newThread.
        Console.WriteLine("Main aborting new thread.")
        newThread.Abort("Information from Main.")

        ' Wait for the thread to terminate.
        newThread.Join()
        Console.WriteLine("New thread terminated - Main exiting.")
    End Sub

    Shared Sub TestMethod()
        Try
            While True
                Console.WriteLine("New thread running.")
                Thread.Sleep(1000)
            End While
        Catch abortException As ThreadAbortException
            Console.WriteLine( _
                CType(abortException.ExceptionState, String))
        End Try
    End Sub

End Class

注解

此方法已过时。 在 .NET 5 及更高版本中,调用此方法将生成编译时警告。 此方法在 .NET 5 及更高版本和 .NET Core 上的运行时引发 PlatformNotSupportedException

在线程上调用此方法时,系统会在线程中引发中止 ThreadAbortException 该方法。 ThreadAbortException 是应用程序代码可以捕获的特殊异常,但在块末尾 catch 重新引发,除非 ResetAbort 被调用。 ResetAbort 取消中止请求,并阻止 ThreadAbortException 终止线程。 在中止线程之前执行未执行的 finally 块。

注释

当线程本身调用 Abort 时,效果类似于引发异常; ThreadAbortException 立即发生,结果可预测。 但是,如果一个线程在另一个线程上调用 Abort ,中止会中断正在运行的任何代码。 有可能中止静态构造函数。 在极少数情况下,这可能会阻止在该应用程序域中创建该类的实例。

不保证线程立即中止或完全中止。 如果线程在作为中止过程的一部分调用的块中 finally 执行无限的计算量,从而无限期地延迟中止,则可能会出现这种情况。 若要等待线程中止,可以在调用Abort该方法后在线程上调用Join该方法,但不能保证等待将结束。

注释

如果中止的线程位于代码的受保护区域(如catch块、finally块或约束执行区域),则调用Abort的线程可能会阻止。 如果调用 Abort 的线程持有中止线程所需的锁,则可能会出现死锁。

如果在 Abort 尚未启动的线程上调用,则调用该线程时 Start 将中止。 如果在 Abort 被阻止或正在休眠的线程上调用,则线程将被中断,然后中止。

如果在Abort已挂起的线程上调用,则会在调用Abort的线程中引发一个ThreadStateException,并将其AbortRequested添加到ThreadState正在中止的线程的属性中。 在调用之前Resume,不会在挂起的线程中引发 AThreadAbortException

如果在 Abort 托管线程执行非托管代码时在托管线程上调用, ThreadAbortException 则在线程返回到托管代码之前不会引发 a。

如果同时发出两个调用 Abort ,则一个调用可以设置状态信息,另一个调用可以执行该 Abort调用。 但是,应用程序无法检测到这种情况。

在线程上调用后 Abort ,线程的状态包括 AbortRequested。 由于成功调用 Abort线程而终止线程后,线程的状态将更改为 Stopped。 具有足够的权限,作为目标 Abort 线程可以使用该方法取消中止 ResetAbort 。 有关演示如何调用 ResetAbort 该方法的示例,请参阅类 ThreadAbortException

另请参阅

适用于