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
Azione consigliata
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>