Aracılığıyla paylaş


Thread.Abort kullanımdan kaldırıldı

API'ler Thread.Abort artık geçerli değil. .NET 5 veya sonraki bir sürümü hedefleyen projeler, bu yöntemler çağrılırsa derleme zamanı uyarısıyla SYSLIB0006 karşılaşır.

Açıklamayı değiştir

Daha önce, Thread.Abort için yapılan çağrılar derleme zamanı uyarısı üretmiyordu, ancak yöntem çalışma zamanında bir PlatformNotSupportedException fırlatıyordu.

.NET 5'den başlayarak, Thread.Abort eski olarak uyarı olarak işaretlenir. Bu yöntemin çağrılması derleyici uyarısı SYSLIB0006üretir. Yönteminin uygulanması değiştirilmeden kalır ve bir PlatformNotSupportedException üretmeye devam eder.

Değişiklik nedeni

Thread.Abort'un, .NET Framework dışındaki tüm .NET uygulamalarında her zaman bir PlatformNotSupportedException fırlattığı göz önüne alındığında, ObsoleteAttribute, yöntemin çağrıldığı yerlere özel dikkat çekmek için eklendi.

Geçerli iş parçacığı dışında bir iş parçacığını sonlandırmak için Thread.Abort çağırdığınızda, hangi kodun yürütüldüğünü veya yürütülmediğini ve ThreadAbortException atıldığında ne zaman olduğunu bilmezsiniz. Ayrıca uygulamanızın durumundan veya korumadan sorumlu olduğu herhangi bir uygulama ve kullanıcı durumundan da emin olamazsınız. Örneğin, Thread.Abort çağrısı yapmak, statik oluşturucuların yürütülmesini veya yönetilen ya da yönetilmeyen kaynakların serbest bırakılmasını engelleyebilir. Bu nedenle Thread.Abort her zaman .NET Core ve .NET 5+ üzerinde bir PlatformNotSupportedException fırlatır.

Sürüm kullanıma sunulmuştur

5.0

  • CancellationToken kullanarak bir iş birimini durdurun, işleme çağrısını Thread.Abort yapmayın. Aşağıdaki örnekte kullanımı gösterilmektedir 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);
        }
    }
    

    Daha fazla bilgi için bkz. Yönetilen iş parçacıklarında iptal.

  • Derleme zamanı uyarısını engellemek için uyarı kodunu SYSLIB0006gizleyin. Uyarı kodu Thread.Abort'a özeldir ve onun bastırılması, kodunuzdaki diğer eski uyarılarını bastırmaz. Ancak uyarıyı engellemek yerine Thread.Abort çağrılarını kaldırmanızı öneririz.

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

    Uyarıyı proje dosyasında da gizleyebilirsiniz.

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

Etkilenen API'ler