Jak wyjść z pętli parallel.for ?
Mam dość złożone oświadczenie, które wygląda następująco:
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
break;
}
}));
Korzystając z klasy równoległej, mogę zdecydowanie zoptymalizować ten proces. Jednak; Nie mogę dowiedzieć się, jak przerwać pętlę równoległą? break;
Oświadczenie wyrzuca następujący błąd składni:
Żadnych otaczających pętli, z których można by przerwać lub kontynuować
c#
multithreading
parallel-processing
parallel.foreach
Rasmus Søborg
źródło
źródło
Odpowiedzi:
Użyj
ParallelLoopState.Break
metody:Lub w twoim przypadku:
źródło
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.
ithere is no guarantee that iterations after the current one will definitely not execute.
state.Stop()
bardziej odpowiednie, aby wiarygodnie osiągnąć oczekiwane wyniki, jak wspomnieli poniżej Mike Perrenoud i MBentleyRobisz to, wywołując przy użyciu przeciążenia
Parallel.For
lub,Parallel.ForEach
które przechodzi w stanie pętli, a następnie wywołującParallelLoopState.Break
lubParallelLoopState.Stop
. Główna różnica polega na tym, jak szybko wszystko się psuje -Break()
pętla przetworzy wszystkie elementy z wcześniejszym „indeksem” niż bieżący. Po użyciuStop()
wyjdzie tak szybko, jak to możliwe.Aby uzyskać szczegółowe informacje, zobacz How to: Stop or Break from a Parallel.For Loop .
źródło
Powinieneś używać
Any
zamiast pętli foreach:Any
jest na tyle sprytny, że zatrzymuje się, gdy tylko wie, że wynik musi być prawdziwy.źródło
LoopState to z pewnością świetna odpowiedź. Zauważyłem, że poprzednie odpowiedzi miały tak wiele innych rzeczy, że trudno było znaleźć odpowiedź, więc oto prosty przypadek:
źródło
Po prostu użyj tego,
loopState
co może być dostarczone.Spójrz na przykład w tym artykule MSDN .
źródło