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.
1001st iş parçacığının sıraya alındığını ve iş parçacıklarından birinin – Jon
@ 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. –
+1 iş parçacığı başına bellek kullanımıyla ilgili ayrıntılar için –