J'essaie de comprendre comment le parallélisme pourrait fonctionner en utilisant PLINQ, étant donné l'exécution retardée. Voici un exemple simple.PLINQ retardé l'exécution
string[] words = { "believe", "receipt", "relief", "field" };
bool result = words.AsParallel().Any(w => w.Contains("ei"));
Avec LINQ, je me attends à l'exécution pour atteindre la valeur de la « réception », et va, sans exécuter la requête pour le repos des valeurs.
Si nous faisons cela en parallèle, l'évaluation de "relief" peut avoir commencé avant que le résultat de "réception" soit revenu. Mais une fois que la requête sait que "réception" va provoquer un vrai résultat, les autres threads céderont-ils immédiatement? Dans mon cas, c'est important parce que le test "any" peut être très coûteux, et je voudrais libérer les processeurs pour l'exécution d'autres tâches.
http://msdn.microsoft.com/en-us/library/dd997425(VS.100).aspx dit principes d'exécution différée sont toujours en jeu avec PLINQ ... pouvez-vous clarifier un peu ce que vous voulez dire dans votre point latéral? – tbischel
@tbischel: Ils le font, et ils ne le font pas ... Ce commentaire est légèrement trompeur. La différence est que, dans LINQ, chaque élément est seulement exécuté comme demandé (différé). Dans PLINQ, dès que vous faites la demande FIRST, un 'Partitioner' est configuré, ce qui commence à planifier votre travail à plusieurs threads. Les résultats cumulés finaux ne sont pas repoussés jusqu'à la demande, mais le traitement se produit avant la demande d'un élément. (Si vous demandez l'élément 1 des résultats, les éléments 1, 2, 3 et 4 peuvent tous être programmés et commencer à "travailler" immédiatement ...) –