Frage Break parallel.foreach?


Wie kann ich ausbrechen? parallel.für Schleife?

Ich habe eine ziemlich komplexe Aussage, die wie folgt aussieht:

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

Mit der parallelen Klasse kann ich diesen Prozess bei weitem optimieren. Jedoch; Ich kann nicht herausfinden, wie man die parallele Schleife bricht. Das break; Anweisung löst folgenden Syntaxfehler aus:

Keine umschließenden Schleifen, aus denen heraus brechen oder fortfahren könnten


75
2017-09-24 18:51


Ursprung


Antworten:


Benutze die ParallelLoopState.Break Methode:

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

Oder in deinem Fall:

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();
        }
    }));

125
2017-09-24 18:56



Sie tun dies, indem Sie die Überladung von verwenden Parallel.For oder Parallel.ForEach welches in einen Schleifenzustand übergeht und dann aufruft ParallelLoopState.Break oder ParallelLoopState.Stop. Der Hauptunterschied besteht darin, wie schnell die Dinge mit - brechen Break()Die Schleife verarbeitet alle Elemente mit einem früheren "Index" als der aktuelle. Mit Stop()Es wird so schnell wie möglich beendet.

Für Details, siehe Gewusst wie: Beenden oder Abbrechen einer Parallel.For-Schleife.


31
2017-09-24 18:56



Was Sie verwenden sollten ist Any, anstatt einer foreach-Schleife:

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

Any ist schlau genug, aufzuhören, sobald es weiß, dass das Ergebnis wahr sein muss.


11
2017-09-24 18:58



LoopState ist sicherlich eine gute Antwort. Ich fand, dass die vorherigen Antworten so viel anderes Zeug hatten, dass es schwer war, die Antwort zu sehen, also hier ist ein einfacher Fall:

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.
});

7
2017-07-31 18:13



Benutze einfach die loopState das kann zur Verfügung gestellt werden.

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

Schau dir das an MSDN-Artikel zum Beispiel.


5
2017-09-24 18:57