Pause parallèle.pour en savoir plus?

Comment puis-je sortir d’une boucle parallèle.for ?

J’ai une déclaration assez complexe qui ressemble à ceci:

Parallel.ForEach(ColorIndex.AsEnumerable(), new Action((ColorIndexHolder Element) => { if (Element.StartIndex = I) { Found = true; break; } })); 

En utilisant la classe parallèle, je peux optimiser ce processus de loin. Toutefois; Je ne peux pas comprendre comment casser la boucle parallèle? La break; instruction renvoie l’erreur de syntaxe suivante:

Pas de boucles fermantes pour briser ou continuer

Utilisez la méthode ParallelLoopState.Break :

  Parallel.ForEach(list, (i, state) => { state.Break(); }); 

Ou dans votre cas:

 Parallel.ForEach(ColorIndex.AsEnumerable(), new Action((ColorIndexHolder Element, ParallelLoopState state) => { if (Element.StartIndex < = I && Element.StartIndex + Element.Length >= I) { Found = true; state.Break(); } })); 

Vous faites cela en appelant en utilisant la surcharge de Parallel.For ou Parallel.ForEach qui passe dans un état de boucle, puis en appelant ParallelLoopState.Break ou ParallelLoopState.Stop . La principale différence réside dans la rapidité avec laquelle les choses se brisent – avec Break() , la boucle traitera tous les éléments avec un “index” antérieur au courant. Avec Stop() , il sortira aussi vite que possible.

Pour plus de détails, voir Comment: arrêter ou interrompre une boucle parallèle .

Ce que vous devez utiliser est Any , plutôt qu’une boucle foreach:

 bool Found = ColorIndex.AsEnumerable().AsParallel() .Any(Element => Element.StartIndex < = I && Element.StartIndex + Element.Length >= I); 

Any est assez intelligent pour arrêter dès qu’il sait que le résultat doit être vrai.

LoopState est certainement une excellente réponse. J’ai trouvé les réponses précédentes tellement différentes qu’il était difficile de voir la réponse, alors voici un cas simple:

 using System.Threading.Tasks; Parallel.ForEach(SomeTable.Rows(), (row, loopState) => { if (row.Value == testValue) { loopState.Stop(); // Stop the ForEach! } // else do some other stuff here. }); 

Utilisez simplement le loopState qui peut être fourni.

 Parallel.ForEach(ColorIndex.AsEnumerable(), new Action((Element, loopState) => { if (Element.StartIndex < = I && Element.StartIndex + Element.Length >= I) { loopState.Stop(); } })); 

Regardez cet article MSDN pour un exemple.