2009-05-17 5 views
0

J'ai un listoddata et une liste de threads dans le thread principal. Je passe chaque élément de données de la liste au thread correspondant. Je veux que le thread principal attende jusqu'à ce que tous les threads soient exécutés.asp.net: pour appeler la méthode join sur plus d'un objet thread?

for (int i = 0; i < listOfThread.Count; i++) 
      { 
       listOfThread[i].Join(); 

      } 
// code after all of thread completes its work 
//code block2 

mais après la première itération de cette boucle de fil conducteur ne sera pas executed.and si un thread 0 est terminé bloc .code sera exécuté. Ce dont je ne veux pas.

Répondre

3

Ceci est une façon parfaitement valide join sur plusieurs threads. Si vous attendez sur tous les threads, même séquentiellement, ce sera très bien. Il n'aura pas à attendre les threads déjà terminés. Si un thread est toujours en cours d'exécution, il attendra que ce thread soit terminé.

1

Sahil, qu'est-ce que vous essayez de faire en vous assurant que la jointure sur tous les threads est appelée sans avoir à attendre que chacun d'eux s'exécute? Si c'est pour la performance, cela n'aidera pas beaucoup, puisque de toute façon, même si vous êtes un thread.join sur tous les threads, il doit attendre que chaque thread soit terminé avant de continuer.

Quoi qu'il en soit si vous devez, alors voici ce que je dois dire:

Il n'y a pas de méthode directe d'attente sur tous les fils dans un stmt. Au lieu de quelque R & D j'ai trouvé une petite méthode indirecte. Au lieu d'initialiser un thread et de lui passer un ParameterizedThreadDelegate, vous pouvez directement lancer BeginInvoke sur ParameterizedThreadDelegate. Et puis vous pouvez utiliser WaitHandle.WaitAll pour attendre que tous les délégués aient fini d'exécuter avant de continuer.

Voici le code:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<ParameterizedThreadStart> listDelegates = new List<ParameterizedThreadStart>(); 
     listDelegates.Add(new ParameterizedThreadStart(DelegateEg.Print)); 
     listDelegates.Add(new ParameterizedThreadStart(DelegateEg.Display)); 

     List<WaitHandle> listWaitHandles = new List<WaitHandle>(); 

     foreach (ParameterizedThreadStart t in listDelegates) 
      listWaitHandles.Add(t.BeginInvoke("In Thread", null, null).AsyncWaitHandle); 

     WaitHandle.WaitAll(listWaitHandles.ToArray()); 

     Console.WriteLine("All threads executed"); 

     Console.Read(); 

    } 
} 

public class DelegateEg 
{ 
    public static void Print(object obj) 
    { 
     Console.WriteLine("In print"); 
     Console.WriteLine(obj); 
    } 

    public static void Display(object obj) 
    { 
     Console.WriteLine("In Display"); 
     Console.WriteLine(obj); 

    } 
} 
+0

merci mais je pense que j'étais stupide.paul pêcheur est juste.il fonctionne déjà bien. –

+1

oui ... j'impliquais la même chose ... de toute façon c'était bon r & d pour moi :) –

Questions connexes