Comment puis-je créer plusieurs threads et attendre qu'ils soient tous terminés ?
Réponses
Trop de publicités?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");
}
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();
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.
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();
}