Frage

ich habe eine listoddata und eine Liste des Fadens in Hauptthread .i jedes Element der Datenliste zu Haupt-Thread zu entsprechendem thread.want am Passieren all Thread zu warten, bis ausgeführt werden.

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

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

, aber nach dem ersten Iteration dieser Schleife wird Haupt-Thread nicht executed.and werden, wenn eine Thread 0 abgeschlossen ist .CODE Block ausgeführt wird. die ich nicht wollen.

War es hilfreich?

Lösung

Dies ist eine absolut gültige Art und Weise auf mehreren Threads join. Wenn Sie auf alle Threads warten, auch der Reihe nach, wird es nur in Ordnung sein. Es muss nicht auf Threads warten, die bereits abgeschlossen sind. Wenn ein Thread noch ausgeführt wird, wird es warten, bis dieser Thread beendet ist.

Andere Tipps

Sahil, was versuchen Sie, indem Sie sicher zu erreichen, ohne auf alle Fäden verbinden genannt werden für jeden von ihnen warten auszuführen? Wenn es für die Leistung, es wird nicht viel helfen, da sowieso, auch wenn Sie eine Thread.Join auf alle Threads Callin, es für jeden des Faden, bevor Sie fortfahren voraus zu beenden warten muss.

Wie auch immer, wenn Sie müssen, dann ist hier, was ich sagen:

Es gibt keine direkte Methode auf alle Fäden in einer Anw des Wartens. Statt nach einiger R & D Ich habe mit einer wenig indirekten Methode kommen. Statt einen Thread zu initialisieren und ein ParameterizedThreadDelegate es vorbei, können Sie direkt auf dem ParameterizedThreadDelegate ein BeginInvoke tun. Und dann können Sie WaitHandle.WaitAll verwenden für alle Teilnehmer zu warten, bevor Sie fortfahren voraus beenden ausgeführt wird.

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);

    }
} 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top