Condividi tramite


Thread.Abort Metodo

Definizione

Genera un'eccezione ThreadAbortException nel thread in cui viene richiamato, per iniziare il processo di terminazione del thread. La chiamata a questo metodo in genere termina il thread.

Overload

Abort()
Obsoleta.

Genera un'eccezione ThreadAbortException nel thread in cui viene richiamato, per iniziare il processo di terminazione del thread. La chiamata a questo metodo in genere termina il thread.

Abort(Object)
Obsoleta.

Genera un'eccezione ThreadAbortException nel thread in cui viene richiamato per iniziare il processo di terminazione del thread fornendo anche informazioni sull'eccezione relative alla terminazione del thread. La chiamata a questo metodo in genere termina il thread.

Commenti

Importante

Il Thread.Abort metodo deve essere usato con cautela. In particolare quando si chiama per interrompere un thread diverso dal thread corrente, non si sa quale codice è stato eseguito o non è stato eseguito quando viene ThreadAbortException generata l'eccezione . Non è inoltre possibile essere certi dello stato dell'applicazione o di qualsiasi applicazione e stato utente responsabile della conservazione. Ad esempio, la Thread.Abort chiamata può impedire l'esecuzione di costruttori statici o il rilascio di risorse non gestite.

Abort()

Attenzione

Thread.Abort is not supported and throws PlatformNotSupportedException.

Genera un'eccezione ThreadAbortException nel thread in cui viene richiamato, per iniziare il processo di terminazione del thread. La chiamata a questo metodo in genere termina il thread.

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 ()
Attributi

Eccezioni

Solo .NET Core e .NET 5+: In tutti i casi.

Il chiamante non dispone dell'autorizzazione richiesta.

Il thread che si sta interrompendo è attualmente sospeso.

Commenti

Questo metodo è obsoleto. In .NET 5 e versioni successive, la chiamata di questo metodo genera un avviso in fase di compilazione. Questo metodo genera un'eccezione PlatformNotSupportedException in fase di esecuzione in .NET 5 e versioni successive e .NET Core.

Quando questo metodo viene richiamato in un thread, il sistema genera ThreadAbortException un'eccezione nel thread per interromperlo. ThreadAbortException è un'eccezione speciale che può essere rilevata dal codice dell'applicazione, ma viene generata nuovamente alla fine del blocco a meno che catch non ResetAbort venga chiamato. ResetAbort annulla la richiesta di interruzione e impedisce ThreadAbortException all'oggetto di terminare il thread. I blocchi non finally eseguiti vengono eseguiti prima dell'interruzione del thread.

Nota

Quando un thread chiama su se stesso, l'effetto è simile alla generazione di un'eccezione. Si verifica immediatamente e il Abort ThreadAbortException risultato è prevedibile. Tuttavia, se un thread chiama Abort su un altro thread, l'interruzione interrompe il codice in esecuzione. Esiste anche la possibilità che un costruttore statico possa essere interrotto. In rari casi, ciò potrebbe impedire la creazione di istanze di tale classe nel dominio applicazione. Nelle versioni .NET Framework 1.0 e 1.1, è possibile che il thread possa interrompersi durante l'esecuzione di un blocco, nel qual caso il blocco viene finally finally interrotto.

Non è garantito che il thread si interrompi immediatamente o affatto. Questa situazione può verificarsi se un thread esegue una quantità illimitata di calcolo nei blocchi chiamati come parte della procedura di interruzione, ritardando finally indefinitamente l'interruzione. Per attendere l'interruzione di un thread, è possibile chiamare il metodo sul thread dopo aver chiamato il metodo , ma non è garantita la fine Join Abort dell'attesa.

Nota

Il thread che chiama potrebbe bloccarsi se il thread che viene interrotto si trova in un'area protetta di codice, ad esempio un blocco, un blocco o un'area Abort catch di esecuzione finally vincolata. Se il thread che chiama contiene un blocco richiesto dal thread interrotto, può verificarsi Abort un deadlock.

Se Abort viene chiamato su un thread che non è stato avviato, il thread verrà interrotto quando Start viene chiamato. Se Abort viene chiamato su un thread bloccato o in stato di sospensione, il thread viene interrotto e quindi interrotto.

Se viene chiamato su un thread sospeso, viene generata un'eccezione nel thread che ha chiamato e viene aggiunto alla proprietà del Abort ThreadStateException thread Abort AbortRequested ThreadState interrotto. Un oggetto non viene generato nel thread sospeso fino ThreadAbortException a quando non viene chiamato Resume .

Se viene chiamato su un thread gestito durante l'esecuzione di codice non gestito, non viene generata un'eccezione finché il Abort thread non torna al codice ThreadAbortException gestito.

Se due chiamate vengono eseguite contemporaneamente, è possibile che una chiamata imposta le informazioni sullo stato e l'altra Abort chiami per eseguire Abort l'oggetto . Tuttavia, un'applicazione non è in grado di rilevare questa situazione.

Dopo Abort che viene richiamato su un thread, lo stato del thread include AbortRequested . Dopo che il thread è stato terminato in seguito a una chiamata riuscita a , lo Abort stato del thread viene modificato in Stopped . Con autorizzazioni sufficienti, un thread che è la destinazione di un Abort può annullare l'interruzione usando il ResetAbort metodo . Per un esempio che illustra la chiamata ResetAbort al metodo , vedere la classe ThreadAbortException .

Vedi anche

Si applica a

Abort(Object)

Attenzione

Thread.Abort is not supported and throws PlatformNotSupportedException.

Genera un'eccezione ThreadAbortException nel thread in cui viene richiamato per iniziare il processo di terminazione del thread fornendo anche informazioni sull'eccezione relative alla terminazione del thread. La chiamata a questo metodo in genere termina il thread.

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)

Parametri

stateInfo
Object

Oggetto che contiene informazioni specifiche dell'applicazione, ad esempio lo stato, che possono essere usate dal thread interrotto.

Attributi

Eccezioni

Solo .NET Core e .NET 5+: In tutti i casi.

Il chiamante non dispone dell'autorizzazione richiesta.

Il thread che si sta interrompendo è attualmente sospeso.

Esempio

Nell'esempio di codice seguente viene illustrato come passare informazioni a un thread interrotto.

using namespace System;
using namespace System::Threading;
ref class Test
{
private:
   Test(){}


public:
   static void TestMethod()
   {
      try
      {
         while ( true )
         {
            Console::WriteLine( "New thread running." );
            Thread::Sleep( 1000 );
         }
      }
      catch ( ThreadAbortException^ abortException ) 
      {
         Console::WriteLine( dynamic_cast<String^>(abortException->ExceptionState) );
      }

   }

};

int main()
{
   Thread^ newThread = gcnew Thread( gcnew ThreadStart( &Test::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." );
}
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);
        }
    }
}
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

Commenti

Questo metodo è obsoleto. In .NET 5 e versioni successive, la chiamata di questo metodo genera un avviso in fase di compilazione. Questo metodo genera PlatformNotSupportedException un'eccezione in fase di esecuzione in .NET 5 e versioni successive e .NET Core.

Quando questo metodo viene richiamato su un thread, il sistema genera ThreadAbortException un'eccezione nel thread per interromperlo. ThreadAbortException è un'eccezione speciale che può essere intercettata dal codice dell'applicazione, ma viene generata nuovamente alla fine del blocco a meno che catch ResetAbort non venga chiamato . ResetAbort annulla la richiesta di interruzione e impedisce a ThreadAbortException di terminare il thread. I blocchi non finally eseguiti vengono eseguiti prima dell'interruzione del thread.

Nota

Quando un thread chiama su se stesso, l'effetto è simile alla generazione di un'eccezione; l'evento si verifica Abort immediatamente e il risultato è ThreadAbortException prevedibile. Tuttavia, se un thread chiama Abort su un altro thread, l'interruzione interrompe il codice in esecuzione. È possibile che un costruttore statico possa essere interrotto. In rari casi, ciò potrebbe impedire la creazione di istanze di tale classe nel dominio applicazione. Nelle versioni .NET Framework 1.0 e 1.1 è possibile che il thread si interrompi durante l'esecuzione di un blocco, nel qual caso il blocco viene finally finally interrotto.

Non è garantito che il thread si interrompi immediatamente o affatto. Questa situazione può verificarsi se un thread esegue una quantità illimitata di calcoli nei blocchi chiamati come parte della procedura di interruzione, ritardando finally indefinitamente l'interruzione. Per attendere l'interruzione di un thread, è possibile chiamare il metodo sul thread dopo aver chiamato il metodo , ma non vi è alcuna garanzia che Join Abort l'attesa terminerà.

Nota

Il thread che chiama potrebbe bloccarsi se il thread interrotto si trova in un'area protetta di codice, ad esempio un blocco, un blocco o un'area Abort catch di esecuzione finally vincolata. Se il thread che chiama Abort contiene un blocco richiesto dal thread interrotto, può verificarsi un deadlock.

Se Abort viene chiamato su un thread che non è stato avviato, il thread verrà interrotto quando viene chiamato Start . Se Abort viene chiamato su un thread bloccato o in sospensione, il thread viene interrotto e quindi interrotto.

Se viene chiamato su un thread sospeso, viene generata un'eccezione nel thread che ha chiamato e viene aggiunto alla proprietà del Abort ThreadStateException thread Abort AbortRequested ThreadState interrotto. Un ThreadAbortException oggetto non viene generato nel thread sospeso fino a quando non viene chiamato Resume .

Se viene chiamato su un thread gestito mentre è in esecuzione codice non gestito, non viene generata un'eccezione finché il Abort thread non torna al codice ThreadAbortException gestito.

Se due chiamate vengono eseguite contemporaneamente, è possibile che una chiamata imposta le informazioni sullo stato e l'altra Abort chiami per eseguire Abort . Tuttavia, un'applicazione non è in grado di rilevare questa situazione.

Dopo Abort che viene richiamato su un thread, lo stato del thread include AbortRequested . Dopo che il thread è stato terminato in seguito a una chiamata riuscita a Abort , lo stato del thread viene modificato in Stopped . Con autorizzazioni sufficienti, un thread di destinazione di può annullare Abort l'interruzione usando il ResetAbort metodo . Per un esempio che illustra la chiamata ResetAbort al metodo , vedere la classe ThreadAbortException .

Vedi anche

Si applica a