2010-08-15 5 views
4

Je ne sais pas comment fonctionne la gestion des threads internes de Parallel.foreach et si elle peut garantir qu'une telle construction fonctionnerait? Où in.hasNext() attend juste un objet dans le flux d'entrée et renvoie la valeur true.C# Est-ce qu'une boucle while foreach parallèle est possible?

Parallel.Foreach(Connections, c => 
    { 
     Input in = c.getInput(); 
     while (in.hasNext()) { 
      object o = in.getNext(); 
      dosomething(o); 
     } 
    } 
); 

Fondamentalement, puis-je exécuter un tas de boucles infinies dans une structure foreach parallèle tout en garantissant qu'ils vont tous fonctionner en même temps. (Pour les courageux, puis-je ajuster cela afin que je puisse modifier la liste de connexion en ajoutant (et en supprimant, ce qui devrait être trivial) les connexions et il lira toujours l'entrée de toutes les connexions dans la liste).

+0

Cela devrait fonctionner, que se passe-t-il lorsque vous l'essayez? –

+0

Je peux l'essayer mais je ne peux pas garantir qu'il ne produira jamais une condition de course. Donnez-moi 15 minutes pour installer un serveur/client de test. – Raynos

+0

J'ai supposé que la configuration d'un serveur/client de test rapide serait aussi simple et rapide que Java. C# n'est pas aussi gentil. – Raynos

Répondre

0
  1. Le nombre de threads utilisant est limitée, de sorte que certains éléments seront traités les uns après les autres.

  2. La modification des listes lors de l'énumération n'est pas bonne. Vous recevrez probablement une exception (en fonction de la liste que vous utilisez

  3. Pourquoi ne pas commencer un nouveau fil par connexion

Exemple Code:

public ConnectionOpen(data) 
{ 
    Connection conn=new ... 
    lock(Connections) 
    { 
     Connections.Add(conn); 
    } 

    new Thread(()=> 
    { 
     Receive(conn);//infinite loop goes here 
    }).Start(); 
} 

public ConnectionClose(conn) 
{ 
    bool removed=false; 
    lock(Connections) 
    { 
     removed=Connections.Remove(conn); 
    } 
    if(removed) conn.StopReceiving(); 
} 
+0

J'ai essayé de formater ce code un peu mieux, mais pour une raison quelconque, l'analyseur StackO avait des problèmes avec lui. – Robaticus

+0

Parfois, la vitesse de développement est nécessaire autre que l'optimisation du code (tels que les sites Web) et cette section que vous m'avez donné s'est avérée inestimable – Eon

0

Fondamentalement, je peux courir un tas d'infini en boucles dans une structure foreach parallèle tout en garantissant qu'ils fonctionnent tous en même temps

Non seulement un nombre limité de threads de travail seront mis en chantier en même temps, donc si vous exécutez des boucles plus infinies que il y a des discussions, les derniers ne seront jamais courir ...

0

Techniquement, ce code fonctionnera, mais le nombre exact de threads qui s'exécutent "simultanément" variera

En plus des extensions parallèles, .NET 4 a également ajouté 'hill climbing' et thread injecti sur le pool de threads, donc le pool de threads .NET essaiera d'ajouter des threads à la boucle Parallel.ForEach pour voir si plus de threads sont complétés, puisque le vôtre n'achèvera jamais le nombre de threads variera, mais je suppose que ce sera non -idéal.

Vous pourriez essayer d'utiliser une construction ParallelWhile, l'équipe a écrit un blog à propos de plusieurs façons de le faire, here is one.

+0

La boucle parallèle parallèle exécute le bloc do du temps en parallèle. J'essaye d'obtenir un parallèle pour boucle avec une boucle infinie dans le bloc do, de sorte que chaque partie de la boucle for soit exécutée même si la boucle infinie est – Raynos

+0

Je ne pense pas que vous obtiendrez ce comportement avec Parallel.ForEach, il semble que vous cherchiez à exécuter N threads en même temps où N est grand. Pourquoi avez-vous besoin de tant de threads en même temps? – Rick