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; }
4 Réponses :
retour code> à l'intérieur d'une boucle de référence parallèle est fondamentalement identique à celui d'un
Continuer code> dans une boucle normale, car le retour code> 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. P>
J'utiliserais plinq ici:
Process.GetCurrentProcess()
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!
Toutes les réponses ci-dessus +: p>
Si vous souhaitez signaler que la boucle doit s'arrêter, vous devez utiliser Parallelloopstate CODE> (vous pouvez accéder à cet objet en passant à l'action
action
Action
.stop () code> ou
.break () code> 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). P>