Thread.Abort obsoleto

Le API Thread.Abort sono obsolete. I progetti destinati a .NET 5 o una versione successiva visualizzeranno un avviso SYSLIB0006 in fase di compilazione se questi metodi vengono chiamati.

Descrizione delle modifiche

In precedenza, le chiamate a Thread.Abort non generavano avvisi in fase di compilazione, ma il metodo generava un'eccezione PlatformNotSupportedException in fase di esecuzione.

A partire da .NET 5, Thread.Abort viene contrassegnato come obsoleto come avviso. La chiamata a questo metodo genera un avviso del compilatore SYSLIB0006. L'implementazione del metodo è invariata e continua a generare un'eccezione PlatformNotSupportedException.

Motivo della modifica

Dato che Thread.Abort genera sempre un'eccezione PlatformNotSupportedException in tutte le implementazioni .NET ad eccezione di .NET Framework, ObsoleteAttribute è stato aggiunto al metodo per attirare l'attenzione sulle posizioni in cui viene chiamato.

Quando si chiama Thread.Abort per interrompere un thread diverso dal thread corrente, non si sa quale codice è stato eseguito o non è riuscito a eseguire quando viene generato ThreadAbortException. Non è inoltre possibile essere certi dello stato dell'applicazione o di qualsiasi applicazione e stato utente responsabile del mantenimento. Ad esempio, la chiamata Thread.Abort può impedire l'esecuzione di costruttori statici o il rilascio di risorse gestite o non gestite. Per questo motivo, Thread.Abort genera sempre un'eccezione PlatformNotSupportedException su .NET Core e .NET 5+.

Versione introdotta

5.0

  • Usare un oggetto CancellationToken per interrompere l'elaborazione di un'unità di lavoro anziché chiamare Thread.Abort. Nell'esempio riportato di seguito viene illustrato l'utilizzo di CancellationToken.

    void ProcessPendingWorkItemsNew(CancellationToken cancellationToken)
    {
        if (QueryIsMoreWorkPending())
        {
            // If the CancellationToken is marked as "needs to cancel",
            // this will throw the appropriate exception.
            cancellationToken.ThrowIfCancellationRequested();
    
            WorkItem work = DequeueWorkItem();
            ProcessWorkItem(work);
        }
    }
    

    Per altre informazioni, vedere Annullamento in thread gestiti.

  • Per eliminare l'avviso in fase di compilazione, eliminare il codice di avviso SYSLIB0006. Il codice di avviso è specifico di Thread.Abort e non elimina altri avvisi obsoleti nel codice. È tuttavia consigliabile rimuovere le chiamate a Thread.Abort anziché eliminare l'avviso.

    void MyMethod()
    {
    #pragma warning disable SYSLIB0006
        Thread.CurrentThread.Abort();
    #pragma warning restore SYSLIB0006
    }
    

    È anche possibile eliminare l'avviso nel file di progetto.

    <PropertyGroup>
      <OutputType>Exe</OutputType>
      <TargetFramework>net5.0</TargetFramework>
      <!-- Disable "Thread.Abort is obsolete" warnings for entire project. -->
      <NoWarn>$(NoWarn);SYSLIB0006</NoWarn>
    </PropertyGroup>
    

API interessate