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

Odpowiedzi:


414
return;

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


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.


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
    }

});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.