Thread.Abort est obsolète

Les API Thread.Abort sont obsolètes. Les projets qui ciblent .NET 5 ou une version ultérieure rencontrent un avertissement SYSLIB0006 au moment de la compilation si ces méthodes sont appelées.

Description de la modification

Auparavant, les appels à Thread.Abort ne produisaient pas d’avertissements au moment de la compilation, mais la méthode lève une PlatformNotSupportedException au moment de l’exécution.

À partir de .NET 5, Thread.Abort est marqué comme avertissement obsolète. L’appel de cette méthode génère un avertissement du compilateur SYSLIB0006. L’implémentation de la méthode est inchangée et continue de lever une PlatformNotSupportedException.

Raison du changement

Étant donné que Thread.Abort lève toujours une PlatformNotSupportedException sur toutes les implémentations .NET à l’exception de .NET Framework, ObsoleteAttribute a été ajouté à la méthode pour attirer l’attention sur les endroits où elle est appelée.

Lorsque vous appelez Thread.Abort pour abandonner un thread autre que le thread actuel, vous ne savez pas quel code s’est exécuté ou n’a pas pu s’exécuter lorsque ThreadAbortException est levée. Vous ne pouvez pas non plus être certain de l’état de votre application ni de l’état de toute application et de l’utilisateur qu’elle doit préserver. Par exemple, l’appel de Thread.Abort peut empêcher l’exécution de constructeurs statiques ou la libération de ressources managées ou non managées. Pour cette raison, Thread.Abort lève toujours une PlatformNotSupportedException sur .NET Core et .NET 5+.

Version introduite

5,0

  • Utilisez un CancellationToken pour abandonner le traitement d’une unité de travail au lieu d’appeler Thread.Abort. L'exemple suivant illustre l'utilisation de 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);
        }
    }
    

    Pour plus d’informations, consultez Annulation dans les threads managés.

  • Pour supprimer l’avertissement au moment de la compilation, supprimez le code d’avertissement SYSLIB0006. Le code d’avertissement est spécifique à Thread.Abort et sa suppression ne supprime pas d’autres avertissements d’obsolescence dans votre code. Toutefois, nous vous recommandons de supprimer les appels à Thread.Abort au lieu de supprimer l’avertissement.

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

    Vous pouvez également supprimer l’avertissement dans votre fichier projet.

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

API affectées