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

İş 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 iş parçacığını Thread.Abort zorla sonlandırmak için 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. (Bununla birlikte, .NET Framework çalışma zamanı her zaman blok sonrasında özel durumu catch otomatik olarak yeniden oluşturur.) Daha fazla bilgi için bkz. Thread.Abort.

Thread.Abort yöntemi .NET 5 (.NET Core dahil) ve sonraki sürümlerde desteklenmez. Üçüncü taraf kodun yürütülmesini .NET 5+ içinde zorla sonlandırmanız gerekiyorsa, ayrı işlemde çalıştırın ve kullanın Process.Kill.

Not

  • Geçerli iş parçacığı dışında bir iş parçacığını durdurmak için çağırdığınızda Thread.Abort , hangi kodun yürütüldiğini veya ne zaman ThreadAbortException yürütülediğini 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, çağrı statik Thread.Abort oluşturucuların yürütülmesini veya yönetilen veya yönetilmeyen kaynakların yayınlanmasını engelleyebilir.
  • Bir iş parçacığı, yöntemi çağrıldığında Abort yönetilmeyen kod yürütüyorsa, çalışma zamanı onu ThreadState.AbortRequestedişaretler. İş parçacığı yönetilen koda geri döndüğünde özel durum oluşturulur.

bir iş parçacığı durdurulduktan sonra yeniden başlatılamaz.

Abort Hedef iş parçacığı bir blokta finally rastgele miktarda kodu yakalayıp yürütebileceğinden yöntemi iş parçacığının ThreadAbortException hemen durdurulmasına neden olmaz. İş parçacığı sona erene kadar beklemeniz gerekiyorsa çağırabilirsiniz Thread.Join . 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. Durdurulan iş parçacığı yöntemini çağırabilir ResetAbort veya bir finally blokta ilişkisiz işlem gerçekleştirebilir, bu nedenle zaman aşımı belirtmezseniz beklemenin sona ermesi garanti edilemez.

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

ThreadAbortException İşleme

İş parçacığınızın, kendi kodunuzdan çağrılması Abort veya iş parçacığının çalıştırıldığıAppDomain.Unload bir uygulama etki alanının kaldırılması (iş parçacıklarını sonlandırmak için kullanılır Thread.Abort ) sonucunda durdurulmasını bekliyorsanız, iş parçacığınızın aşağıdaki kodda gösterildiği gibi öğesini işlemesi ThreadAbortException ve bir finally yan tümcede 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 kodunuzun catch yan tümcesinde veya finally yan tümcesinde olması gerekir çünkü ThreadAbortException sistem tarafından yan tümcenin finally sonunda veya yan tümcesi yoksa finally yan tümcenin catch sonunda yeniden oluşturulur.

yöntemini çağırarak sistemin özel durumu yeniden oluşturmasını Thread.ResetAbort engelleyebilirsiniz. Ancak, bunu yalnızca kendi kodunuz neden olursa ThreadAbortExceptionyapmalısınız.

Ayrıca bkz.