asynchronousThreadAbort MDA

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 uygulamaya ç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ısmi tamamlamadan sonra kesilmiştir ve uygulama verileri öngörülemez bir durumda bırakılmıştır. Genellikle ThreadAbortException bir özel durumun ortaya çıkması beklenilmeyen yerlerde, kodun yürütülmesinde rastgele gibi görünen noktalardan oluşturulabilir. Kod böyle bir özel durumu işleyemeyebilir ve bu da bozuk bir duruma neden olabilir.

Belirtiler, soruna bağlı rastgelelik nedeniyle büyük ölçüde farklılık gösterebilir.

Nedeni

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ığı durdurma zaman uyumsuzdur. zaman uyumlu iş parçacığı iptalleri 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ığı durdurulmaları, hedef iş parçacığının yürütülmesinde öngörülemeyen noktalarda işlenmeleri nedeniyle 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 alınmasına dikkat etmek için hemen her kod satırında bir ThreadAbortException işlemesi gerekir. Kodun bu sorunla birlikte 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, hedef iş parçacığına kesme isteğinde bulunan ortak özellik gibi bir mekanizma eklemektir. Hedef iş parçacığı belirli güvenli denetim noktalarında sinyali denetler. Bir kesmenin 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ığı iptalleriyle ilgili verileri bildirir.

Çıktı

MDA, durdurmayı gerçekleştiren iş parçacığının kimliğini ve durdurmanın 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ı çalışan bir iş parçacığında çağrısı Abort 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.