2009-05-17 3 views
0

Ich habe eine Listododata und eine Liste von Thread im Hauptthread .Ich übertrage jedes Element Daten der Liste zu entsprechenden thread.want zu Haupt Thread zu warten, bis alle Thread ausgeführt werden.asp.net: Join-Methode auf mehr als einen Thread-Objekte aufrufen?

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

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

aber nach der ersten Iteration dieses Hauptfadenschlaufe wird nicht executed.and werden, wenn irgendein Thread 0 .CODE Block ausgeführt wird beendet. was ich nicht will.

Antwort

3

Dies ist eine absolut gültige Weise zu join auf mehrere Threads. Wenn Sie auf alle Threads warten, auch sequentiell, wird es in Ordnung sein. Es muss nicht auf Threads warten, die bereits abgeschlossen sind. Wenn ein Thread noch läuft, wartet er, bis dieser Thread abgeschlossen ist.

1

Sahil, was versuchst du zu erreichen, indem du sicherstellst, dass Join auf allen Threads aufgerufen wird, ohne auf die Ausführung jedes einzelnen warten zu müssen? Wenn es für die Leistung ist, wird es nicht viel helfen, da sowieso, selbst wenn Sie einen Thread aufrufen. Verbinden Sie alle Threads, es muss warten, bis jeder Thread fertig ist, bevor Sie fortfahren.

Sowieso, wenn Sie müssen, dann ist hier, was ich zu sagen habe:

Es gibt keine direkte Methode des Wartens auf alle Fäden in einem stmt ist. Stattdessen habe ich nach etwas R & D eine etwas indirekte Methode erfunden. Anstatt einen Thread zu initialisieren und ihm ein ParameterizedThreadDelegate zu übergeben, können Sie direkt ein BeginInvoke für das ParameterizedThreadDelegate ausführen. Und dann können Sie WaitHandle.WaitAll verwenden, um auf die Ausführung aller Delegierten zu warten, bevor Sie fortfahren.

Hier ist der 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

danke, aber ich denke, ich war doof.paul fisher ist richtig.es läuft schon gut. –

+1

ja ... ich deutete das gleiche an ... wie auch immer, es war gut r & d für mich :) –

Verwandte Themen