A Thread.Abort metódus elavult

Az Thread.Abort API-k elavultak. A .NET 5-ös vagy újabb verzióját megcélzott projektek fordítási időre vonatkozó figyelmeztetést SYSLIB0006 kapnak, ha ezek a metódusok meghívásra kerülnek.

Módosítás leírása

Korábban a Thread.Abort hívások nem eredményeztek fordítási időbeli figyelmeztetéseket, azonban a metódus futásidőben PlatformNotSupportedException-t dobott.

A .NET 5-től kezdődően Thread.Abort elavultként van megjelölve, és figyelmeztetést generál. Ennek a metódusnak a meghívása fordítási figyelmeztetést SYSLIB0006eredményez. A módszer megvalósítása nem változik, és továbbra is dob egy PlatformNotSupportedException hibaüzenetet.

A változás oka

Mivel a Thread.Abort .NET-keretrendszer kivételével mindig minden PlatformNotSupportedException .NET-implementációra hatással van, ObsoleteAttribute a rendszer hozzáadta a metódust, hogy felhívja a figyelmet azokra a helyekre, ahol meghívják.

Amikor az aktuális száltól eltérő szál megszakítására hívja meg a hívást Thread.Abort , nem tudja, hogy milyen kódot hajtottak végre, vagy nem sikerült végrehajtani a ThreadAbortException dobáskor. Nem lehetsz biztos az alkalmazás állapotában vagy bármely olyan állapotban, amelyet az alkalmazásnak és a felhasználónak meg kell őriznie. A hívás Thread.Abort például megakadályozhatja a statikus konstruktorok végrehajtását, illetve a felügyelt vagy nem felügyelt erőforrások kiadását. Ezért Thread.Abort mindig dob egy PlatformNotSupportedException-et a .NET Core-on és a .NET 5+-on.

Bevezetett verzió

5,0

  • Használjon egy CancellationToken a munkaegység feldolgozásának megszakítására a Thread.Abort hívása helyett. Az alábbi példa szemlélteti a CancellationToken használatát.

    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);
        }
    }
    

    További információ: Lemondás felügyelt szálakban.

  • A fordítási idő figyelmeztetésének letiltásához tiltsa le a figyelmeztető kódot SYSLIB0006. A figyelmeztető kód konkrétan a Thread.Abort vonatkozik, és ennek elnyomása nem szünteti meg a kódban lévő egyéb elavulásra vonatkozó figyelmeztetéseket. Azonban javasoljuk, hogy a figyelmeztetés mellőzése helyett távolítsa el a Thread.Abort hívásokat.

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

    A projektfájlban lévő figyelmeztetést is letilthatja.

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

Érintett API-k