98 votes

Casser parallèle.pour chaque?

Comment puis-je sortir d'un parallèle.pour la boucle?

J'ai une assez complexe déclaration qui se présente comme 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 en parallèle de la classe, je peux optimiser ce processus de loin. Cependant, je ne peux pas comprendre comment briser la boucle parallèle? L' break; déclaration déclenche suite à erreur de syntaxe:

Pas d'enfermer les boucles d'où break ou continue

170voto

Tudor Points 39539

Utilisez la méthode ParallelLoopState.Break :

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

Ou dans votre cas:

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

40voto

Reed Copsey Points 315315

Vous faites cela en appelant à l'aide de la surcharge de l' Parallel.For ou Parallel.ForEach qui passe dans une boucle de l'état, puis de l'appel d' ParallelLoopState.Break ou ParallelLoopState.Stop. La principale différence est dans la façon dont rapidement les choses rupture avec Break(), la boucle va traiter tous les éléments avec un plus "index" que l'actuel. Avec Stop(), il sera de sortie le plus rapidement possible.

Pour plus de détails, consultez Comment: Stop ou Pause à partir d'un Parallèle.Pour La Boucle.

12voto

Servy Points 93720

Ce que vous devriez 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 suffisamment intelligent pour s'arrêter dès qu'il sait que le résultat doit être vrai.

5voto

Michael Perrenoud Points 37869

Utilisez simplement les loopState qui peuvent être fournis.

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

Regardez cet article MSDN pour un exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X