2012-07-09 6 views
-6

J'ai créé l'application multi-thread suivant:C# multithread - très lent

http://blog.milrr.com/2010/03/code-c-simple-multithreading-example.html

Il a beaucoup de problèmes de performance. Cela ressemble, chaque thread s'exécute un par un.

1 temps de fin de fil est 1-2 secondes et 30 fils a un temps d'achèvement de 35-40 secondes.

S'il vous plaît me conseiller ce qui peut être problème. J'utilise .net framework 3.5.

Merci

+3

Tbh, ce n'est pas un bon exemple de multithreading. Cela montre seulement le côté technique, pas comment l'utiliser correctement. Le multithreading n'est pas une victoire instantanée, il n'accélèrera pas par magie votre application. – Dykam

+10

Veuillez poster votre code, pas un lien vers le modèle que vous avez suivi. –

+0

combien de cœurs a votre machine? –

Répondre

0

de plusieurs threads sont avantageuses pour les opérations d'E/S et pour les opérations où vous devez attendre des ressources, ou de donner une meilleure expérience utilisateur en attendant un long processus en cours d'exécution. Mais les threads ont leur propre surcharge et s'ils ne sont pas utilisés correctement, ils peuvent ralentir les choses.

+2

Le multi-threading réel IMO, où vous exécutez du code non trivial sur plusieurs threads, n'est pas utile pour les opérations d'E/S ou d'autres opérations d'attente, il est uniquement utile pour les opérations liées à l'UC. Pour les opérations d'E/S, le déclenchement d'un événement à la fin sur le thread principal est beaucoup plus agréable. – CodesInChaos

+0

J'ai 2 noyaux sur la machine. J'ai un très gros code, j'ai suivi exactement la même méthode que dans url. Est-ce la bonne approche? Quelqu'un peut-il poster url où je peux voir comment mettre en œuvre multithread qui peut me donner de bonnes performances? –

0

threads sont utilisés pour améliorer les performances ..

Link vous avez donné utilise du threads..so Queuing vous sentez comme son lent ..

Cependant, vous pouvez utiliser les threads pour exécuter si elles en parallèle ne pas intervenir les uns des autres ..

aller here pour 4 .NET

pour 3,5 aller here, here, etc ..

1

Cet exemple ne crée pas 30 threads, il crée 30 tâches pour le pool de threads. Le pool lui-même conservera généralement le nombre de threads qu'il utilise proche du nombre de cœurs du système.

Supposons que vous ayez 2 cœurs. Cela signifie que le pool ne planifie pas plus de 2-3 tâches en même temps, ce qui signifie que si vous créez 30 tâches, votre temps d'exécution ne sera pas plus rapide que la moitié du temps d'une application unique exécutant les tâches de manière séquentielle. Cela est logique, car il est absurde de supposer que vous pouvez mieux que 2x accélérer avec 2 cœurs (sauf pour quelques situations particulières).

En outre, cet exemple ne montre aucun calcul significatif. Il crée juste un nombre donné de tâches faisant des calculs isolés. Plus vous créerez de tâches, plus il faudra de temps pour terminer, ce qui explique pourquoi vous constatez une augmentation du temps de fonctionnement, plus vous créez de tâches.

En bref:

  1. Ce blog est un mauvais exemple d'accélérer une application (et je suis sûr que ce ne fut pas le but de la poste).
  2. La création de plusieurs threads n'accélère pas l'application si vous êtes lié au processeur.
-1

Vous pouvez faire quelque chose comme ça,

private List<Thread> myThreads = new List<Thread>(); 

Ici, vous construisez une liste de fils, de sorte que lorsque vous regardez d'exécuter un fil comme faisant présent, vous ajoutez simplement à la liste ci-dessus ....

foreeach (Thing i want to start multiple times) 
{ 

var thrd = new Thread(aThread); 

myThreads.Add(aThread); 
aThread.Start(); 

} 

Ensuite, vous appelez une méthode qui attend les fils pour rejoindre ...

WaitUntilAllThreadsComplete(); 

private void WaitUntilAllThreadsComplete() 

     { 
      foreach (Thread t in myThreads) 
      { 
       t.Join(); 
      } 
     } 

Quelque chose comme ça .. désolé, c'est assez vague .. mais peut aider ???

-2

En termes simples, les threads sont mauvais. Vous souhaitez uniquement utiliser des threads dans des situations spécifiques et dans des parties spécifiques du code. Un grand exemple déjà mentionné est aléatoire, tâche incroyablement longue qui une fois exécuté n'a absolument rien à voir avec le reste du programme mais doit être fait.