Aracılığıyla paylaş


asynchronousThreadAbort MDA

Not

Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.

Yönetilen asynchronousThreadAbort hata ayıklama yardımcısı (MDA), bir iş parçacığı başka bir iş parçacığına zaman uyumsuz bir durdurma eklemeye çalıştığında etkinleştirilir. Zaman uyumlu iş parçacığı iptalleri MDA'yi asynchronousThreadAbort etkinleştirmez.

Belirtiler

Ana uygulama iş parçacığı durdurulduğunda bir uygulama işlenmemiş ThreadAbortException olarak kilitleniyor. Uygulama yürütülmeye devam edecekse, bunun sonuçları uygulamanın kilitlenmesinden daha kötü olabilir ve bu da daha fazla veri bozulmasına neden olabilir.

Atomik olması amaçlanmış işlemler büyük olasılıkla kısmen tamamlandıktan sonra kesilmiş ve uygulama verileri öngörülemeyen bir durumda bırakılmıştır. Genellikle ThreadAbortException bir özel durumun ortaya çıkması beklenmediği yerlerde kodun yürütülmesinde rastgele görünen noktalardan oluşturulabilir. Kod böyle bir özel durumu işleyemeyebilir ve bu da bozuk bir duruma neden olabilir.

Belirtiler, sorunun doğasında bulunan rastgelelik nedeniyle büyük ölçüde farklılık gösterebilir.

Neden

Zaman uyumsuz iş parçacığı iptalini Thread.Abort tanıtmak için hedef iş parçacığında yöntemi adlı bir iş parçacığındaki kod. çağrısı Abort yapan kod, durdurma işleminin hedefinden farklı bir iş parçacığında çalıştığından iş parçacığı iptali zaman uyumsuzdur. zaman uyumlu iş parçacığı iptalleri bir soruna neden olmamalıdır çünkü öğesini gerçekleştiren Abort iş parçacığının bunu yalnızca uygulama durumunun tutarlı olduğu güvenli bir denetim noktasında yapmış olması gerekir.

Zaman uyumsuz iş parçacığı iptalleri, hedef iş parçacığının yürütülmesinde öngörülemeyen noktalarda işlendiği için bir sorun oluşturur. Bunu önlemek için, bu şekilde durdurulabilecek bir iş parçacığında çalıştırılacak şekilde yazılan kodun, uygulama verilerinin tutarlı bir duruma geri döndürülmesi için neredeyse her kod satırında işlemesi gerekir ThreadAbortException . Kodun bu sorun göz önünde bulundurularak yazılması veya olası tüm koşullara karşı koruma sağlayan kodlar yazılması gerçekçi değildir.

Yönetilmeyen koda ve finally bloklara yapılan çağrılar zaman uyumsuz olarak durdurulmayacak, ancak bu kategorilerden birinden çıkıldığında hemen durdurulacaktır.

Sorunun doğasında bulunan rastgelelik nedeniyle nedeni belirlemek zor olabilir.

Çözüm

Zaman uyumsuz iş parçacığı iptallerinin kullanılmasını gerektiren kod tasarımından kaçının. Hedef iş parçacığının kesintiye uğraması için çağrısı Abortgerektirmeyen birkaç yaklaşım daha uygundur. En güvenlisi, ortak özellik gibi hedef iş parçacığına kesme isteğinde bulunan bir mekanizma eklemektir. Hedef iş parçacığı belirli güvenli denetim noktalarında sinyali denetler. Kesme istendiğini fark ederse düzgün bir şekilde kapatılabilir.

Çalışma Zamanı üzerindeki etkisi

Bu MDA'nın CLR üzerinde hiçbir etkisi yoktur. Yalnızca zaman uyumsuz iş parçacığı durdurmalarıyla ilgili verileri bildirir.

Çıktı

MDA, iptali gerçekleştiren iş parçacığının kimliğini ve iptalin hedefi olan iş parçacığının kimliğini bildirir. Zaman uyumsuz iptallerle sınırlı olduğundan bunlar hiçbir zaman aynı olmayacaktır.

Yapılandırma

<mdaConfig>
  <assistants>
    <asynchronousThreadAbort />
  </assistants>
</mdaConfig>

Örnek

MDA'yı asynchronousThreadAbort etkinleştirmek için yalnızca ayrı bir çalışan iş parçacığında çağrısı Abort yapılması gerekir. İş parçacığı başlatma işlevinin içeriğinin, durdurma tarafından herhangi bir rastgele noktada kesintiye uğrayabilecek daha karmaşık işlemler kümesi olup olmadığını göz önünde bulundurun.

using System.Threading;
void FireMda()
{
    Thread t = new Thread(delegate() { Thread.Sleep(1000); });
    t.Start();
    // The following line activates the MDA.
    t.Abort();
    t.Join();
}

Ayrıca bkz.