40 votes

Attendre que les threads du pool se terminent

Je suis désolé pour cette question redondante. Cependant, j'ai trouvé de nombreuses solutions à mon problème mais aucune n'est très bien expliquée. J'espère que ce sera clair, ici.

Le thread principal de mon application C# génère 1..n travailleurs en arrière-plan en utilisant le ThreadPool. Je souhaite que le thread d'origine se verrouille jusqu'à ce que tous les travailleurs aient terminé. J'ai fait des recherches sur le ManualResetEvent en particulier, mais je ne comprends pas bien son utilité.

En pseudo :

foreach( var o in collection )
{
  queue new worker(o);
}

while( workers not completed ) { continue; }

Si nécessaire, je connaîtrai à l'avance le nombre de travailleurs qui vont être mis en file d'attente.

0 votes

Bonjour, consultez un article similaire ici stackoverflow.com/questions/358721/

-2voto

Attendre l'achèvement de tous les threads dans le pool de threads, il n'y a pas de méthode intégrée disponible. En utilisant le nombre de threads actifs, nous pouvons le faire...

{
        bool working = true;
        ThreadPool.GetMaxThreads(out int maxWorkerThreads, out int maxCompletionPortThreads);
        while (working)
        {
            ThreadPool.GetAvailableThreads(out int workerThreads, out int completionPortThreads);
            //Console.WriteLine($"{workerThreads} , {maxWorkerThreads}");
            if (workerThreads == maxWorkerThreads)
            { working = false; }
        }
        //when all threads are completed then 'working' will be false 
    }
    void xyz(object o)
    {
        console.writeline("");
    }

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