2010-08-19 8 views
1

J'ai le code ci-dessous, où je Spawn plusieurs fils, normalement environ 7, et les rejoindre à attendre jusqu'à ce que tous sont effectuées:C# Threading - fils multiples a donné naissance, seulement 1 ou 2 sont l'exécution d'autres qui attendent

  List<Thread> threads = new List<Thread>(); 
      Thread thread; 
      foreach (int size in _parameterCombinations.Keys) 
      { 
       thread = new Thread(new ParameterizedThreadStart(CalculateResults)); 
       thread.Start(size); 
       threads.Add(thread); 
      } 

      // wait for all threads to finish 
      for (int index = 0; index < threads.Count; index++) 
      { 
       threads[index].Join(); 
      } 

Lorsque je vérifie la plupart du temps seulement un ou deux threads s'exécutent en même temps, seulement une ou deux fois quand je relance l'application tous exécutés.

Existe-t-il un moyen de forcer l'exécution de tous les threads?

Merci beaucoup.

+2

Puisque nous ne savons pas la définition de CalculateResults difficile de dire si cette méthode bloque à un moment donné, mais qui expliquerait le comportement observé. –

+1

combien de cœurs y a-t-il sur votre machine? seul un nombre de threads peut réellement fonctionner en parallèle. – luke

+0

Combien de temps dure la tâche de calcul? – Adibe7

Répondre

0

Votre code est correct .. je l'ai modifié abit pour vous montrer que l'exécution du thread n'est pas limitée à 2 threads. je chercherais des problèmes dans le processus de calcul ..

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Thread> threads = new List<Thread>(); 
     Thread thread; 
     for (int i = 0; i < 7; i++) 
     { 
      thread = new Thread(new ParameterizedThreadStart(CalculateResults)); 
      thread.Start(); 
      threads.Add(thread); 
     } 

     // wait for all threads to finish 
     for (int index = 0; index < threads.Count; index++) 
     { 
      threads[index].Join(); 
     } 
    } 

    static void CalculateResults(object obj) 
    { 
     Console.WriteLine("Thread number " + Thread.CurrentThread.ManagedThreadId + " is alive"); 
     Thread.Sleep(1000); 
     Console.WriteLine("Thread number " + Thread.CurrentThread.ManagedThreadId + " is closing"); 
    } 
} 
+0

Adibe, merci de m'indiquer dans la bonne direction. J'ai remplacé l'appel à ma fonction intensive CPU avec Thread.Sleep et ça a bien fonctionné. La fonction Calculate consomme tout le CPU et il est difficile pour le système d'exploitation de changer les threads que je suspecte. – user335023

+0

@ misha-r: Vos threads de calcul seront préemptés et replanifiés par le système d'exploitation si nécessaire. –