87 votes

Créez plusieurs threads et attendez qu'ils se terminent tous

Comment puis-je créer plusieurs threads et attendre qu'ils soient tous terminés ?

150voto

Greg Sansom Points 9059

Cela dépend de la version du .NET Framework que vous utilisez. .NET 4.0 a grandement facilité la gestion des threads à l'aide de Tasks :

 class Program
{
    static void Main(string[] args)
    {
        Task task1 = Task.Factory.StartNew(() => doStuff());
        Task task2 = Task.Factory.StartNew(() => doStuff());
        Task task3 = Task.Factory.StartNew(() => doStuff());

        Task.WaitAll(task1, task2, task3);
                Console.WriteLine("All threads complete");
    }

    static void doStuff()
    {
        //do stuff here
    }
}

Dans les versions précédentes de .NET, vous pouviez utiliser l'objet BackgroundWorker , utiliser ThreadPool.QueueUserWorkItem() , ou créer vos threads manuellement et utiliser Thread.Join() pour attendre qu'ils se terminent :

 static void Main(string[] args)
{
    Thread t1 = new Thread(doStuff);
    t1.Start();

    Thread t2 = new Thread(doStuff);
    t2.Start();

    Thread t3 = new Thread(doStuff);
    t3.Start();

    t1.Join();
    t2.Join();
    t3.Join();

    Console.WriteLine("All threads complete");
}

9voto

Vincent Points 325

J'ai créé une méthode d'extension très simple pour attendre tous les threads d'une collection :

 using System.Collections.Generic;
using System.Threading;

namespace Extensions
{
    public static class ThreadExtension
    {
        public static void WaitAll(this IEnumerable<Thread> threads)
        {
            if(threads!=null)
            {
                foreach(Thread thread in threads)
                { thread.Join(); }
            }
        }
    }
}

Ensuite, vous appelez simplement :

 List<Thread> threads=new List<Thread>();
// Add your threads to this collection
threads.WaitAll();

5voto

SLaks Points 391154

Dans .NET 4.0, vous pouvez utiliser la bibliothèque parallèle de tâches .

Dans les versions antérieures, vous pouvez créer une liste d' Thread dans une boucle, en appelant Start sur chacun, puis faire une autre boucle et appeler Join sur chacun une.

5voto

Alexey Smirnov Points 29

Si vous ne souhaitez pas utiliser la classe Task (par exemple, dans .NET 3.5), vous pouvez simplement démarrer tous vos threads, puis les ajouter à la liste et les joindre dans une boucle foreach.

Exemple:

 List<Thread> threads = new List<Thread>();


// Start threads
for(int i = 0; i<10; i++)
{
    int tmp = i; // Copy value for closure
    Thread t = new Thread(() => Console.WriteLine(tmp));
    t.Start;
    threads.Add(t);
}

// Await threads
foreach(Thread thread in threads)
{
    thread.Join();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X