Existe-t-il un équivalent de «continuer» dans un Parallel.ForEach?

249

Je porte du code vers Parallel.ForEachet j'ai une erreur avec un continuej'ai dans le code. Y a-t-il quelque chose d'équivalent que je peux utiliser dans un Parallel.ForEachéquivalent fonctionnel continuedans une foreachboucle?

Parallel.ForEach(items, parallelOptions, item =>
{
    if (!isTrue)
        continue;
});
John Egbert
la source

Réponses:

414
return;

(le corps n'est qu'une fonction appelée pour chaque élément)

Dave
la source
23

Lorsque vous avez converti votre boucle en une définition compatible pour la logique Parallel.Foreach, vous avez fini par transformer le corps de l'instruction en lambda. Eh bien, c'est une action qui est appelée par la fonction parallèle.

Donc, remplacez continuepar returnet rompez avec les instructions Stop()or Break().

Taran
la source
1
Une meilleure option possible que de remplacer les sauts par des instructions de retour est Stop () et Break () de ParallelLoopState. blogs.msdn.com/b/pfxteam/archive/2009/05/27/9645023.aspx
JasonCoder
@JasonCoder aucun de ceux-ci n'est équivalent à continuecependant.
sera
1
@ sera correct, c'est pourquoi j'ai dit des pauses. les déclarations de retour remplacent les déclarations de poursuite
JasonCoder
@JasonCoder - Ah. j'ai mal compris ce que vous vouliez dire, oups.
va
-1

Pour continuer, cela signifie ignorer le reste du bloc et passer à l'élément suivant. Vous pouvez donc implémenter continue en appliquant la condition opposée au reste du bloc.

Par exemple, le code de la question serait réécrit comme suit:

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
la source