İş parçacıklarını yok et

İş parçacığının yürütülmesini sonlandırmak için genellikle işbirliğine dayalı iptal modelini kullanırsınız. Ancak bazen iş parçacığını işbirliğiyle durdurmak mümkün değildir çünkü işbirliğine dayalı iptal için tasarlanmamış üçüncü taraf kodu çalıştırır. .NET Framework uygulamalarında, yönetilen bir iş parçacığını zorla sonlandırmak için Thread.Abort yöntemini kullanabilirsiniz. çağırdığınızda AbortOrtak Dil Çalışma Zamanı hedef iş parçacığında hedef iş parçacığının yakalayabileceği bir ThreadAbortException oluşturur. (Ancak, .NET Framework çalışma zamanı catch bloğunun sonrasında özel durumu her zaman otomatik olarak yeniden fırlatır.) Daha fazla bilgi için bkz. Thread.Abort.

Thread.Abort yöntemi, .NET Core ve .NET 5 ve sonraki sürümlerinde çalışma zamanında bir PlatformNotSupportedException fırlatır. .NET 5'den başlayarak, eski (SYSLIB0006) olarak da işaretlenir, bu nedenle çağrılması bir derleme zamanı uyarısı oluşturur. Üçüncü taraf kodun yürütülmesini modern .NET uygulamalarında zorla sonlandırmanız gerekiyorsa, bunu ayrı bir işlemde çalıştırın ve kullanın Process.Kill.

Uyarı

  • 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.
  • Bir iş parçacığı, Abort yöntemi çağrıldığında yönetilmeyen kod yürütüyorsa, çalışma zamanı onu ThreadState.AbortRequested olarak işaretler. İş parçacığı yönetilen koda geri döndüğünde özel durum oluşturulur.

Bir iş parçacığı sonlandırıldıktan sonra yeniden başlatılamaz.

Abort yöntemi, hedef iş parçacığı ThreadAbortException bir blokta rastgele miktarda kodu yakalayıp çalıştırabileceği için iş parçacığının hemen durmasına neden olmaz. Eğer iş parçacığı sona erene kadar beklemeniz gerekiyorsa, Thread.Join çağırabilirsiniz. Thread.Join , iş parçacığı yürütmeyi gerçekten durdurana veya isteğe bağlı bir zaman aşımı aralığı geçene kadar döndürülmeyen bir engelleme çağrısıdır. Durdurulmuş iş parçacığı ResetAbort yöntemini çağırabilir veya bir finally blokta sınırsız işlem gerçekleştirebilir, bu nedenle bir zaman aşımı belirtmezseniz beklemenin sona ereceği garanti edilmez.

Thread.Join yöntemine yapılan bir çağrıyı bekleyen iş parçacıkları, Thread.Interrupt çağıran diğer iş parçacıkları tarafından kesilebilir.

ThreadAbortException ile Başa Çıkma

İş parçacığınızın, kendi kodunuzdan Abort çağrılması veya iş parçacığının çalıştırıldığı AppDomain.Unload bir uygulama etki alanının kaldırılması (Thread.Abort iş parçacıklarını sonlandırmak için kullanılır) sonucunda sonlandırılmasını bekliyorsanız, iş parçacığınızın aşağıdaki kodda gösterildiği gibi ThreadAbortException öğesini işlemesi ve bir finally bloğunda son işlemeyi gerçekleştirmesi gerekir.

Try
    ' Code that is executing when the thread is aborted.
Catch ex As ThreadAbortException
    ' Clean-up code can go here.
    ' If there is no Finally clause, ThreadAbortException is
    ' re-thrown by the system at the end of the Catch clause.
Finally
    ' Clean-up code can go here.
End Try
' Do not put clean-up code here, because the exception
' is rethrown at the end of the Finally clause.
try
{
    // Code that is executing when the thread is aborted.
}
catch (ThreadAbortException ex)
{
    // Clean-up code can go here.
    // If there is no Finally clause, ThreadAbortException is
    // re-thrown by the system at the end of the Catch clause.
}
// Do not put clean-up code here, because the exception
// is rethrown at the end of the Finally clause.

Temizleme kodunun catch veya finally tümcesinde olması gerekir çünkü ThreadAbortException sistem tarafından finally tümcesinin sonunda veya catch tümcesinin finally sonunda, herhangi bir finally tümcesi yoksa yeniden fırlatılır.

Thread.ResetAbort yöntemini çağırarak sistemin özel durumu yeniden fırlatmasını engelleyebilirsiniz. Ancak, buna yalnızca kendi kodunuzun ThreadAbortException'e neden olması durumunda yapmalısınız.

Ayrıca bakınız