2012-03-13 22 views
5

ThreadPool'u kullanan .Net 4 Görev sınıfını kullanırken, tüm Konular meşgulse ne olur?Görev kullanırken ThreadPool dolu/meşgulse ne olur?

TaskScheduler yeni bir iş parçacığı yaratır ve ThreadPool maksimum iş parçacığı sayısını genişletir mi, yoksa bir iş parçacığı olana kadar bekler mi?

cevap

7

ThreadPool'daki iş parçacıklarının maksimum sayısı, bir .NET4.0 32 bit sistemde 1000 iş parçacığına ayarlanmıştır. .NET'in eski sürümleri için daha az. Eğer 1000 iş parçacığınız varsa, 1001st görevini sıraya soktuğunuzda, bir nedenle engellediklerini söyleyin, hiçbir zaman çalışmayacaktır.

Maksimum iş parçacığı sayısını 32 bit işlemle asla vurmazsınız. Her iş parçacığının en az 1 MB bellek (kullanıcı modu yığınının boyutu) ve diğer tüm ek yükleri aldığını unutmayın. Zaten CLR ve yerel DLL'lerin yüklü olduğu bir çok belleği kaybedersiniz, bu yüzden bu çok parçayı kullanmadan önce bir OutOfMemoryException vurursunuz.

ThreadPool'ün ThreadPool.SetMaxThreads yöntemini çağırarak kullanabileceği iş parçacığı sayısını değiştirebilirsiniz. Ancak, bu çok sayıda ileti dizisini kullanmayı düşünüyorsanız, kodunuzla ilgili bir büyük sorun yaşarsınız. Ben yapmam, bunun gibi ThreadPool yapılandırmalarıyla uğraşmanızı tavsiye etmiyor. Büyük ihtimalle daha da kötü performans elde edersiniz.

Task ve ThreadPool.QueueUserWorkItem ile aklınızda bulundurun, iş parçacığı bittiğinde yeniden kullanılır. Bir görev veya kuyruk iş parçacığı oluşturursanız, veya kodunuzu yürütmek için yeni bir iş parçacığı oluşturamayabilir. Havuzda zaten mevcut olan iplikler varsa, (pahalı) yeni bir iplik oluşturmak yerine bunlardan birini tekrar kullanacaktır. Yalnızca görevlerde yürütmekte olduğunuz yöntemler hiçbir zaman geri dönmezse, iş parçacıklarının bitmesi konusunda endişelenmeniz gerekir, fakat dediğim gibi, bu sizin kodunuzla tamamen farklı bir sorundur.

+0

1001st iş parçacığının sıraya alındığını ve iş parçacıklarından birinin – Jon

+0

@ Jon engelini kaldırabileceğini varsayalım, bu doğru. Eh, 32-bit bir sistemde, muhtemelen 1000 iş parçacığı bellek kalmadan çalıştırmak mümkün olmaz, ancak, evet, bu olmadı varsayarak, bir iş parçacığı serbest bırakıldığında iş parçacığı sonunda çalışır. –

+0

+1 iş parçacığı başına bellek kullanımıyla ilgili ayrıntılar için –

6

Varsayılan olarak, ThreadPool'un MaxThreads değeri çok yüksektir. Genellikle asla oraya ulaşmazsınız, uygulamanız ilk önce kilitlenir.

Tüm iş parçacıkları meşgul olduğunda, yeni görevler sıraya konur ve yavaş yavaş, en fazla 500 ms'de 1, TP yeni iş parçacıkları atayacaktır.

+0

MaxThreads özelliğinin ne anlama geldiğini bilmenin bir yolu var mı? – Jon

+0

[ThreadPool.GetMaxThreads Yöntem] 'i (http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getmaxthreads%28v=vs.100%29.aspx) –

4

Bu, MaxThreads değerini artırmaz. Mevcut iş parçacığından daha fazla görev olduğunda, bazı görevler sıraya alınacak ve iş parçacığı havuzu kullanılabilir bir iş parçacığı sağlayana kadar bekleyecektir. Çok sayıda çekirdek (çalışma hırsızlığı, iplik enjeksiyonu, vb.) Ile ölçeklendirmek için bazı oldukça gelişmiş şeyler yapar.

+1

numaralı telefonu arayın. maxthreads. Kesinlikle bazı yeni konuları yapabilir –

+0

Whoops, clarified. Teşekkürler. –

İlgili konular