7
votes

Valeur de retour et mot-clé à l'intérieur d'un parallèle

Quelle est la bonne façon de renvoyer une valeur d'un parallèle toeach ou de boucle?

Par exemple est le code suivant correct / threadsafe? p>

{
    Process[] processes = Process.GetProcesses();
    List<String> ProcessNames = new List<String>();
    Parallel.ForEach(processes, curItem => {
            ProcessNames.Add(processes.ProcessName);
        }
    });
    return ProcessNames;
}


0 commentaires

4 Réponses :


6
votes

retour à l'intérieur d'une boucle de référence parallèle est fondamentalement identique à celui d'un Continuer dans une boucle normale, car le retour est à l'intérieur du délégué que est exécuté pour chaque élément. Cela signifie que cela ne termine pas de threads et notamment ne termine pas l'exécution de la boucle parallèle à la boucle.


0 commentaires

9
votes

J'utiliserais plinq ici:

Process.GetCurrentProcess()


3 commentaires

Je fais juste ça pour jouer avec le concept. Je suppose que ça ne le fait pas.


Est ce juste moi? Le code ci-dessus jette l'erreur suivante: Win32Exception n'a pas été non géré par le code de l'utilisateur. L'accès est refusé - je suppose que cela a quelque chose à voir avec la comparaison de poignées?


Pas dans mon cas, j'ai une classe de fenêtre personnalisée. Il met en œuvre la fonctionnalité que l'objet de processus ne fournit pas. J'essayais simplement d'éviter un autre appel d'API et de jouer avec le concept. On dirait que cela ne fonctionne pas dans une boucle standard non plus. OMS!



5
votes

Ni est correct. Vous recherchez une valeur? parallèle.foreach est la mauvaise solution ici. Ce que vous recherchez est un réduction , tandis que foreach < / CODE> Effectue un mappage . Une réduction parallèle peut être effectuée en utilisant Plinq.


0 commentaires

6
votes

Toutes les réponses ci-dessus +:

Si vous souhaitez signaler que la boucle doit s'arrêter, vous devez utiliser Parallelloopstate (vous pouvez accéder à cet objet en passant à l'action action au lieu de Action délégué. Objet d'état a une méthode comme .stop () ou .break () qui signalera que vous souhaitez arrêter d'exécuter votre boucle ( et peu d'autres propriétés utiles, essayez-la par vous-même).


0 commentaires