2010-12-07 15 views
5

6100 liste öğesinin listesini işleyen bir işlevim var. Liste sadece 300 ürün olduğunda çalışmak için kullanılan kod. Ama hemen 6100 ile çöker. Ben bir anda 30 söylemek ve bu öğe başına yeni bir iş parçacığı yürütmek bu 6100 öğeler arasında geçiş yapabilirsiniz bir yolu var mı?C# .net For() Step?

for (var i = 0; i < ListProxies.Items.Count; i++) 
    { 
     var s = ListProxies.Items[i] as string; 
     var thread = new ParameterizedThreadStart(ProxyTest.IsAlive); 
     var doIt = new Thread(thread) { Name = "CheckProxy# " + i }; 
     doIt.Start(s); 
    } 

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

+3

Kayıt için tam olarak kilitlenen (çizgi) ve kilitlenme mesajının tam olarak ne anlama geldiğini ve isimlendirildiğini bulmak için çözümler bulmakta büyük fayda var – Eric

cevap

10

gerçekten'un her iş öğesi için yeni bir iş parçacığı oluşturması gerekiyor mu? Bunun için gerçek bir ihtiyaç olmadıkça (eğer öyleyse, lütfen bize nedenini söyleyin), bunun yerine Managed Thread Pool'u kullanmanızı şiddetle tavsiye ederim. Bu, size ihtiyaç duyduğunuz eşzamanlılık faydalarını verecektir, ancak binlerce iş parçacığının çalıştırılması için kaynak gereksinimleri (oluşturma, imha ve masif içerik değiştirme maliyetleri) olmadan. .NET 4.0 kullanıyorsanız, Task Parallel Library kullanmayı da düşünebilirsiniz. Örneğin

: Başka bir kayda göre

for (var i = 0; i < ListProxies.Items.Count; i++) 
{ 
    var s = ListProxies.Items[i] as string; 
    ThreadPool.QueueUserWorkItem(ProxyTest.IsAlive, s);  
} 

, ciddi beri (bir boolean özellik veya yöntem gibi görünüyor) IsAlive yöntemi yeniden adlandırma düşünürdünüz:

  1. Açıkça bir void IsAlive(object) imzası vardır .
  2. Gözden geçirilebilir yan etkilere sahiptir (kendi yorumunuzdan "bir ilerleme çubuğunu artırma ve yeni bir listeye 'çalışan' bir proxy ekleme").
+1

ThreadPool kesinlikle buraya gitmenin yolu olacaktır. İpler pahalıdır. – lesscode

+0

Anlaşmalı. Bunlar uzun süren iş parçacıkları olmadıkça, bu iş parçacığı havuzu için bir yer olurdu. Aynı zamanda paralel kütüphaneye bakabilir ve yükü çekirdeğe yaymak için paralel olarak kullanabilirsiniz. – Zippit

+0

@Wayne Konu gerçekten pahalı değil ... 6000 iş parçacığı sadece tamamen aşırı olsa :-) (numarayı yönetmek için bir şey kullanmakta haklısın.) –

3

Yay yapabileceğiniz iş parçacıklarının sayısı üzerinde bir sınırlama vardır. 6100 iş parçacığı biraz heyecanlı görünüyor.

Ani'yi kabul ediyorum, ne yapmaya çalıştığınıza bağlı olarak bir ThreadPool'a, hatta bir Üretici/Tüketici sürecine bakmalısınız.

Çok iş parçacıklı uygulamaların işlenmesiyle ilgili birkaç işlem vardır, ancak başlangıçta ne yaptığınızı bilmeden bir ThreadPool veya Producer/Consumer işlemi (SyncEvents ile Kuyruklar) dışındaki herhangi bir yaklaşımı önermenin gerçekten hiçbir yolu yoktur.

Her halükarda, iş parçacığı sayısını minimumda tutmaya çalışmalısınız, aksi takdirde, iş parçacığı kilitleri, döndürme kilitleri, kilitlenme kilitleri, ölü kilitler, yarış koşulları, kim bilir, vb. Riskini çalıştırırsınız ...

C# ile iş parçacığı hakkında iyi bilgi isterseniz, Concurrent Programming on Windows By Joe Duffy kitabını gözden geçirin gerçekten yararlıdır.