Kabul edilebilir İmha aramayı kabul edilmez() VUK Görev nesnesi. | Netgez.com
SORU
17 EYLÃœL 2010, Cuma


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
17 EYLÃœL 2010, Cuma


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:

  1. 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ın IAsyncResult.AsyncWaitHandle Task
  2. 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.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • manadude21

    manadude21

    11 Mart 2008
  • wafflepwn

    wafflepwn

    14 AÄžUSTOS 2008
  • whiteboy7thst

    whiteboy7ths

    1 Temmuz 2009