Havuzu.Queueuserworkıtem vs Görev.Fabrika.StartNew
ne aşağıda arasındaki farktır
ThreadPool.QueueUserWorkItem
vs
Task.Factory.StartNew
Eğer yukarıdaki kodu 500 kez uzun süre çalışan bazı görev yaptığı için çağrılırsa tüm iş parçacığı havuzu iş parçacığı alınan olacak mı?
Ya TRAFİK (2. seçenek) sadece iş parçacığı daha az ya da işlemci sayısı eşit almak için yeterince akıllı olacak?
CEVAP
Eğer VUK ile uzun süren bir görevi başlatmak için gidiyoruz, yani TaskCreationOptions.LongRunning
, belirtmeniz gerekiryokiş parçacığı havuzu üzerinde zamanlama. (EDİT: yorum Olarak, bu kaydettizamanlayıcı özgü bir karar, ve sert ve hızlı bir garanti değildir, ancak herhangi bir mantıklı üretim zamanlayıcı iş parçacığı havuzu üzerinde uzun süre çalışan görev planlama önleyeceğini umut ediyorum.)
Kesinlikle iş parçacığı havuzu kendine uzun süren görevler, çok sayıda program gerekmiyor. Bu gün iş parçacığı havuzu varsayılan boyutu oldukça büyük olduğunu düşünüyorum sık sık bu şekilde istismar nedeniyle) ama temel olarak bu şekilde kullanılmamalıdır.
İş parçacığı havuzu noktası kaçınmaktırkısaaslında görevlerini yapıyorlar zamanı ile karşılaştırıldığında, yeni bir iş parçacığı oluşturma büyük bir hit alıyor. Eğer bu görevi uzun bir süre için çalışan, yeni bir iş parçacığı oluşturma etkisi nispeten az zaten olacak - ve potansiyel iş parçacığı havuzu iş parçacığı dışında sokmayı istemiyorum. (Daha az, ama ben değilyaptıdaha önceki sürümlerinde bu deneyimi .NET.)
Eğer bir seçeneğim olsaydı şahsen, ben kesinlikle Task
API oldukça güzel gerekçesiyle VUK - ama kullanmak istiyorumyapınbu görev uzun süre çalıştırmak için beklediğiniz VUK söylemeyi unutma.
EDİT: yorumlarda da belirtildiği Gibi, aynı zamanda choosing between the TPL and the thread pool PFX takımın blog yazısı bkz
Sonuç olarak, CLR takımın Havuzu geliştirici zaten açıkladığından daha ifade edeyim:
Task is now the preferred way to queue work to the thread pool.
EDİT: yorumlardan Da bu VUK Eğer gerçekten istiyorsan custom schedulers kullanmak için izin verir unutma
Görev.Fabrika.() StartNew çağıran iş p...
Paralel.Dosyalarda grup vs Görev.Fabri...
İş parçacığı oluşturma - Görev.Fabrika...
Havuzu Kullanma.Queueuserworkıtem ASP....
Özel iplik Java 8'de paralel akış havu...