Czy istnieje odpowiednik „kontynuuj” w Parallel.ForEach?

249

Przesyłam trochę kodu Parallel.ForEachi mam błąd z continuekodem, który mam w kodzie. Czy istnieje coś równoważne można używać w sposób Parallel.ForEachfunkcjonalny odpowiednik continuew foreachpętli?

Parallel.ForEach(items, parallelOptions, item =>
{
    if (!isTrue)
        continue;
});
John Egbert
źródło

Odpowiedzi:

414
return;

(ciało jest tylko funkcją wywoływaną dla każdego elementu)

Dave
źródło
23

Po przekonwertowaniu pętli na kompatybilną definicję dla logiki Parallel.Foreach, w efekcie ciało instrukcji stało się lambda. Cóż, jest to akcja wywoływana przez funkcję Parallel.

Tak, wymień continuesię returni zerwać z Stop()lub Break()oświadczenia.

Taran
źródło
1
Możliwą lepszą opcją niż zamienianie przerw na instrukcje return jest Stop () i Break () ParallelLoopState. blogs.msdn.com/b/pfxteam/archive/2009/05/27/9645023.aspx
JasonCoder
@JasonCoder żaden z nich nie jest jednak równoważny continue.
będzie
1
@ będzie poprawne, dlatego powiedziałem przerwy. instrukcje return zastępują instrukcje ciąg dalszy
JasonCoder
@JasonCoder - Ah. źle zrozumiałem, co miałeś na myśli, ups.
będzie
-1

Kontynuacja oznacza pominięcie reszty bloku i przejście do następnego elementu. Tak więc możesz zaimplementować kontynuuj, stosując warunek przeciwny do reszty bloku.

Na przykład kod w pytaniu zostałby przepisany jako:

Parallel.ForEach(items, parallelOptions, item =>
{
    //Skip an item by applying the opposite condition used for continue on all items until the end of the foreach

    if (isTrue) 
    {
      //Do what you want to do for all items
    }

});
Shadi Namrouti
źródło