Kabul edilebilir İmha aramayı kabul edilmez() VUK Görev nesnesi.
Bir arka plan iş parçacığı üzerinde çalıştırmak için bir görev tetiklemek istiyorum. Görevler tamamlandığında beklemek istemiyorum.
.net 3.5 bu yapardım:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
.net 4. Tavsiye görmemiştim yaygın biçimi:
Task.Factory.StartNew(() => { DoSomething(); });
Ancak, StartNew()
yöntemi IDisposable
uygulayan Task
bir nesne döndürür. Bu
bu modeli tavsiye ederim. insanlar tarafından göz ardı edilecek gibi görünüyor Diyor ki: Task.Dispose()
yöntemi TechNet belgeleri
"Her zaman bırakmadan önce İmha Görevi için son başvuru çağrı."
Tamamlanıncaya kadar bir görev üzerinde atma diyemezsin, ana iş parçacığı bekleyin ve imha konuşma yaparken ilk başta bir arka plan iş parçacığı yapıyor sürekli. Ayrıca temizlik için kullanılabilecek tamamlanmış/bitmiş bir olay gibi görünmüyor.
Görev sınıf sayfasında bu konuda yorum yok MSDN ve kitap "Pro C#2010..." aynı desen ve görev bertaraf edilmesi ile ilgili hiçbir yorum yapar önerir.
Bilsem bırak sonlandırıcısı will catch sonuna, ama bu birazdan geri gelip beni ısırmaya zaman yapıyorum, bir sürü ateş ve unut görevler gibi bu ve sonlandırıcı iş parçacığı alır boğulmuş?
Bu yüzden benim sorular şunlardır:
- Bu durumda
Task
sınıfıDispose()
arama kabul edilebilir mi? Ve eğer öyleyse, neden ve/sonuçları riskleri vardır? - Bu açıklanan herhangi bir belge var mı?
- Yoksa özledim
Task
nesne yardımcı olduğu uygun bir yolu var mı? - Ya da orada bir yangın yapmak için yeni bir yol & TRAFİK ile görevleri unutmak mı?
CEVAP
in the MSDN forums bu konuda bir tartışma var.
Stephen Toub, Microsoft pfx ekibinin bir üyesi için şöyle demiş:
Görev.Görev nedeniyle var atmayın olası bir olay başa sarma görev bekleyen kullanıldığında tam olay bekliyor konu aslında blok (gibi iplik karşıt ya da potansiyel bekleyen o görevini yerine getiren). Eğer yaptığın tüm kullanıyorsa devamı için, bu olay olacaktır işlemek hiç ayrılacak
...
muhtemelen daha iyi sonuçlanması üzerine şeyler dikkat çekmek için kullanır.
Güncelleme (Ekim 2012)
Stephen Toub biraz daha ayrıntı veren bir blog Do I need to dispose of Tasks? başlıklı gönderdi ve gelişmeleri açıklar .Net 4.5.
Özetle: Task
nesnelerin ™ atılması gerek yok.
Bir nesne imha etmek için iki ana nedeni vardır: zamanında, deterministik bir şekilde yönetilmeyen kaynakları boşaltmak için, nesnenin sonlandırıcı çalışan. maliyeti önlemek için Ne bu Task
çoğu zaman geçerlidir:
- Gibi .Net 4.5, sadece
Task
ayırır iç bekle kolu (yalnızca yönetilmeyen kaynaklarıTask
nesne olduğu açıkça kullanınIAsyncResult.AsyncWaitHandle
Task
- Bir sonlandırıcı var kendisi yok; kolu
Task
nesne bir sonlandırıcı ile bir nesnenin kendisi sarılır, ayrılmış olmasaydı, sonlandırıcı çalıştırmak için var.
PHP kısa etiketleri kullanmak kabul ed...
Sınırları scala&; kabul edilebilir kar...
Neden uçucu yararlı birden çok iş parç...
Böyle büyük mükafat - configure: error...
Tanımsız davranış ile dalları ulaşılam...