Lire en anglais

Partager via


Procédure : créer et exécuter une requête PLINQ simple

L’exemple suivant explique de quelle manière créer une requête Parallel LINQ simple à l’aide de la méthode d’extension ParallelEnumerable.AsParallel sur la séquence source, et exécuter la requête à l’aide de la méthode ParallelEnumerable.ForAll.

Notes

Cette documentation utilise des expressions lambda pour définir les délégués en PLINQ. Si les expressions lambda en C# ou Visual Basic ne vous sont pas familières, consultez la page Expressions lambda en PLINQ et dans la bibliothèque parallèle de tâches.

Exemple

using System;
using System.Linq;

class ExampleForAll
{
    public static void Main()
    {
        var source = Enumerable.Range(100, 20000);

        // Result sequence might be out of order.
        var parallelQuery =
            from num in source.AsParallel()
            where num % 10 == 0
            select num;

        // Process result sequence in parallel
        parallelQuery.ForAll((e) => DoSomething(e));

        // Or use foreach to merge results first.
        foreach (var n in parallelQuery)
        {
            Console.WriteLine(n);
        }

        // You can also use ToArray, ToList, etc as with LINQ to Objects.
        var parallelQuery2 =
            (from num in source.AsParallel()
             where num % 10 == 0
             select num).ToArray();

        // Method syntax is also supported
        var parallelQuery3 =
            source.AsParallel()
                .Where(n => n % 10 == 0)
                .Select(n => n);

        Console.WriteLine("\nPress any key to exit...");
        Console.ReadLine();
    }

    static void DoSomething(int _) { }
}

Cet exemple illustre le modèle de base pour la création et l’exécution de toute requête LINQ Parallel lorsque le classement de la séquence de résultat est sans importance. Les requêtes non ordonnées sont généralement plus rapides que les requêtes ordonnées. La requête partitionne la source en tâches qui sont exécutées de façon asynchrone sur plusieurs threads. L'ordre dans lequel chaque tâche se termine ne dépend pas uniquement de la quantité de travail impliquée pour traiter les éléments de la partition, mais également de facteurs externes tels que la façon dont le système d'exploitation planifie chaque thread. Cet exemple, destiné à illustrer l'utilisation, peut ne pas s'exécuter plus rapidement que la requête LINQ to Objects séquentielle équivalente. Pour plus d’informations sur l’accélération, consultez Fonctionnement de l’accélération dans PLINQ. Pour plus d'informations sur la conservation du classement des éléments d'une requête, consultez Comment : contrôler l'ordre dans une requête PLINQ.

Voir aussi


Ressources supplémentaires