MSDN'de, Thread.Abort () yönteminin açıklaması şöyle diyor: "Bu yöntemi çağırmak genellikle iş parçacığını sonlandırır."
Neden HER ZAMAN olmasın?
Hangi durumlarda iş parçacığını sonlandırmaz?
Konuları sonlandırmanın başka bir yolu var mı?
MSDN'de, Thread.Abort () yönteminin açıklaması şöyle diyor: "Bu yöntemi çağırmak genellikle iş parçacığını sonlandırır."
Neden HER ZAMAN olmasın?
Hangi durumlarda iş parçacığını sonlandırmaz?
Konuları sonlandırmanın başka bir yolu var mı?
Yanıtlar:
Thread.Abort()
ThreadAbortException
iş parçacığına bir enjekte eder . İş parçacığı arayarak isteği iptal edebilir Thread.ResetAbort()
. Ayrıca, finally
istisna ele alınmadan önce çalıştırılacak blok gibi belirli kod parçaları vardır . Herhangi bir nedenden dolayı iş parçacığı böyle bir blokta sıkışmışsa, iş parçacığında istisna asla ortaya çıkmayacaktır.
Arayan kişi arama sırasında iş parçacığının durumu üzerinde çok az kontrole sahip olduğundan Abort()
, genellikle bunu yapması tavsiye edilmez. Bunun yerine iş parçacığına sonlandırma isteyen bir mesaj iletin.
Hangi durumlarda iş parçacığını sonlandırmaz?
Bu soru bir kopya.
Thread.Abort () kullanmanın nesi yanlış?
Konuları sonlandırmak için başka bir olasılık var mı?
Evet. Senin sorunun şu ki, kibarca durmasını söyleyemeyeceğin bir iş parçacığı asla başlatmamalısın ve zamanında dur. (1) Durdurması zor, (2) hatalı veya en kötüsü (3) kullanıcıya düşman olabilecek bir ileti dizisi başlatmanız gereken bir durumdaysanız, yapılacak doğru şey yapmaktır. yeni bir işlem, iş parçacığını yeni işlemde başlatın ve ardından iş parçacığının aşağı inmesini istediğinizde işlemi sonlandırın . İşbirliği yapmayan bir iş parçacığının güvenli bir şekilde sonlandırılmasını garanti edebilecek tek şey, işletim sisteminin tüm sürecini kaldırmasıdır.
Daha fazla ayrıntı için bu soruya verdiğim aşırı uzun cevabıma bakın:
C # 'da bir döngü içinde kilit ifadesini kullanma
İlgili kısım, sonlandırmadan önce bir iş parçacığının kendisini öldürmesi için ne kadar beklemeniz gerektiğine dair düşüncelerin neler olduğunu tartıştığım son kısımdır.
Neden HER ZAMAN olmasın? Hangi durumlarda ipliği sonlandırmaz?
Yeni başlayanlar için, bir iş parçacığı a'yı yakalayabilir ThreadAbortException
ve kendi sonlandırmasını iptal edebilir . Ya da siz onu durdurmaya çalışırken sonsuza kadar sürecek bir hesaplama yapabilir. Bu nedenle, çalışma zamanı, siz sorduktan sonra iş parçacığının her zaman sona ereceğini garanti edemez.
ThreadAbortException
daha fazla var:
Bir iş parçacığını yok etmek için Abort yöntemine bir çağrı yapıldığında, ortak dil çalışma zamanı bir ThreadAbortExceptionoluşturur. ThreadAbortException, yakalanabilen özel bir istisnadır, ancak catch bloğunun sonunda otomatik olarak yeniden yükseltilecektir. Bu istisna ortaya çıktığında, çalışma zamanı evreyi sonlandırmadan önce tüm son blokları yürütür. İş parçacığı, son bloklarda sınırsız bir hesaplama yapabildiğinden veya
Thread.ResetAbort()
iptali iptal etmek için çağrı yapabildiğinden , iş parçacığının biteceğine dair hiçbir garanti yoktur.
Abort()
Manuel olarak bir iş parçacığı oluşturmanıza gerek yoktur . Basitçe iş parçacığındaki yöntemin geri dönmesine izin verirseniz, CLR sizin için tüm kirli işleri yapacaktır; bu iş parçacığı normal şekilde sonlandıracaktır.
Ya iş parçacığı bir kilit tutuyorsa ve durdurulursa / öldürülürse? Kaynaklar sıkışmış durumda
Bir iş parçacığı kendini iptal çağırdığında ancak başka bir iş parçacığı tarafından olmadığında iyi çalışır. İptal, görevini tamamlamamış olsa bile etkilenen iş parçacığını zorla sonlandırır ve kaynakların temizlenmesi için hiçbir fırsat sağlamaz
MSDN'ye başvur
Bir döngüde sıkışmış bir iş parçacığını iptal edemiyorum:
//immortal
Thread th1 = new Thread(() => { while (true) {}});
Bununla birlikte, döngü sırasında uyursa iş parçacığını iptal edebilirim:
//mortal
Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});
ThreadAborts, bir nihayet bloğunun içinde veya BeginCriticalRegion ile EndCriticalRegion arasında oluşmaz
Çünkü işleyiciyi yakalayabilir ThreadAbortException
ve Thread.ResetAbort
içini arayabilirsiniz .
OT: Kapsamlı, dilden bağımsız, şüpheli derecede yararlı ve cüretkar komik eşzamanlılık değerlendirmesi için bkz Verity Stob !
İş parçacığının Abort () çağrısını duymak için çok meşgul olduğu durumlar yaşadım, bu genellikle koduma bir ThreadAbortingException atılmasına neden oluyor.