Internet'teki tüm makaleler, Thread.Abort
öğesinin kötülük olduğunu (çünkü eşitleme ilkellerinin işletim sistemine ait olması ve işlemin sonlandırılmadığını ve iş parçacıklarının iptal edilmesinden sonra ilkellerin kilitli kalmaya devam edebileceğini) söylüyor. Geliştiriciler, tüm süreçleri sona erdirmeyi tavsiye eder, çünkü işlem sistemi, işlem durduğunda eşitleme ilkellerini serbest bırakır.İnce senkronizasyon sınıfları, AppDomain başına mı, yoksa Proses başına mı?
Will
AppDomain
boşaltma yardım, tekSlim
senkronizasyon ilkeller kullanacaksa? (.net 4.0 ile iş parçacığıyla ilgili birkaç yeni sınıf eklenmiştir:ManualResetEventSlim
,SemaphoreSlim
,ReaderWriterLockSlim
).Dokümantasyon, ilkellerin uygulama kodunun tamamen yönetildiğinden, bu ilkellerin farklı işlemlerde kullanılmayacağını söylüyor. Ama anlamıyorum - bu ilkeller
AppDomain
sınırında çalışır. (bkz. Can't set synchronization context when using appdomains)- Evet, nasıl yapıyorlar? Hayır ise, o zaman neden dokümantasyon bu sınırlamayı kabul etmiyor?
YUKARI: Tüm kodlarım, kaldırdığım etki alanındaki kod da dahil olmak üzere, tarafımdan güvenilen. Süreç sonlandırıldığında iş parçacığını bırakmak istemiyorum. "Bayrak" ve "güzel mimarlık yapmak" yerine iş parçacığını sonlandırmak (iptal etmek) istiyorum. Önce ek iş parçacığı oluşturmak gerekliyse (bence bu, bir tane daha iş parçacığı oluşturmak için ayrı bir etki alanında arka plan işlemenin başlangıcında gereklidir), yapacağım. "Ayar bayrağı" yaklaşımını kullanmak istemiyorum, çünkü bayrak kontrolleri ile arka plan algoritmasını çalmamı gerektiriyor, çünkü çalışma zamanı veya derleyici benim için o enstrümanı otomatikleştirmeli. Şu anda böyle bir enstrümantasyon yok, bu yüzden yaklaşımı alan adı boşaltma ile uygulamaya çalışıyorum.
Her komut (veya derin iç içe döngülerde) arasında denetim ekleme, kodu önemli ölçüde yavaşlatacaktır. Tesadüfi yerlerde kontrol eklenmesi, sonlandırma garantisi vermez. İptal güvenli kod yazmanın zorlukları çözülebilirse, neden ipleri iptal edip alan adını kaldırmaya çalışmayın?
ile GitHub proje bulabilirim? Seri hale getirilemezler ve "MarshalByRefObject" den miras almazlar. –
AppDomain bu sorunu çözmektedir. Ancak, uygulama alanlarındaki senkronizasyon ilkellerini kullanamazsanız, * her şeyi atmayı göze alabilmeniz gerekir *. –
"Thread.Abort" ile bahsettiğinizden daha fazla sorun var (aslında, thread.Abort' ile bazı eşitleme ilkelleri çok iyi yayınlanır; iş parçacığı aslında elbette ölür). Soru şu, neden ortak iptal yerine agresif kürtajı kullanmaya çalışıyorsunuz? Sadece bir sinyal gönderin ve iş parçacığının iptal edildiğinde ne zaman karar vermesine izin verin. İptal edilen güvenli kod yazılması, hem yönetilen hem de yerel kaynaklar için sadece iş parçacığı için güvenli koddan çok daha zordur. – Luaan