Comment sortir d'une boucle parallel.for ?
J'ai une déclaration assez complexe qui ressemble à ce qui suit:
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
break;
}
}));
En utilisant la classe parallèle, je peux optimiser ce processus de loin. Toutefois; Je n'arrive pas à comprendre comment briser la boucle parallèle? L' break;
instruction renvoie l'erreur de syntaxe suivante:
Pas de boucles englobantes pour interrompre ou continuer
c#
multithreading
parallel-processing
parallel.foreach
Rasmus Søborg
la source
la source
Réponses:
Utilisez la
ParallelLoopState.Break
méthode:Ou dans votre cas:
la source
Calling the Break method informs the for operation that iterations after the current one don't have to execute. However, all iterations before the current one will still have to be executed if they haven't already.
etthere is no guarantee that iterations after the current one will definitely not execute.
state.Stop()
plus approprié pour atteindre de manière fiable les résultats attendus, comme mentionné ci-dessous par Mike Perrenoud et MBentleyVous faites cela en appelant en utilisant la surcharge de
Parallel.For
ouParallel.ForEach
qui passe dans un état de boucle, puis en appelantParallelLoopState.Break
ouParallelLoopState.Stop
. La principale différence réside dans la rapidité avec laquelle les choses se cassent - avecBreak()
, la boucle traitera tous les éléments avec un "index" antérieur à l'actuel. AvecStop()
, il sortira le plus rapidement possible.Pour plus de détails, consultez Comment: arrêter ou interrompre une boucle Parallel.For .
la source
Ce que vous devriez utiliser est
Any
plutôt qu'une boucle foreach:Any
est assez intelligent pour s'arrêter dès qu'il sait que le résultat doit être vrai.la source
LoopState est certainement une excellente réponse. J'ai trouvé que les réponses précédentes contenaient tellement d'autres choses qu'il était difficile de voir la réponse, alors voici un cas simple:
la source
Utilisez simplement le
loopState
qui peut être fourni.Regardez cet article MSDN pour un exemple.
la source