Wie breche ich aus einer parallel.for- Schleife aus?
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 Parallel Class kann ich diesen Prozess bei weitem optimieren. Jedoch; Ich kann nicht herausfinden, wie ich die Parallelschleife unterbrechen kann. Die break;
Anweisung löst folgenden Syntaxfehler aus:
Keine umschließenden Schleifen, aus denen herausgebrochen oder fortgefahren werden kann
c#
multithreading
parallel-processing
parallel.foreach
Rasmus Søborg
quelle
quelle
Antworten:
Verwenden Sie die
ParallelLoopState.Break
Methode:Oder in Ihrem Fall:
quelle
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.
undthere is no guarantee that iterations after the current one will definitely not execute.
state.Stop()
es angemessener, die erwarteten Ergebnisse zuverlässig zu erzielen, wie unten von Mike Perrenoud und MBentley erwähntSie tun dies, indem Sie mit der Überladung von
Parallel.For
oder aufrufen, dieParallel.ForEach
in einem Schleifenzustand übergeben wird, und dannParallelLoopState.Break
oder aufrufenParallelLoopState.Stop
. Der Hauptunterschied besteht darin, wie schnell die Dinge brechen - mit verarbeitetBreak()
die Schleife alle Elemente mit einem früheren "Index" als dem aktuellen. MitStop()
wird es so schnell wie möglich beendet.Weitere Informationen finden Sie unter Gewusst wie: Stoppen oder Unterbrechen einer Parallel.For-Schleife .
quelle
Was Sie verwenden sollten, ist
Any
anstelle einer foreach-Schleife:Any
ist klug genug, um aufzuhören, sobald es weiß, dass das Ergebnis wahr sein muss.quelle
LoopState ist sicherlich eine gute Antwort. Ich fand, dass die vorherigen Antworten so viele andere Dinge enthielten, dass es schwierig war, die Antwort zu sehen. Hier ist ein einfacher Fall:
quelle
Verwenden Sie einfach die
loopState
, was zur Verfügung gestellt werden kann.In diesem MSDN-Artikel finden Sie ein Beispiel.
quelle