Partager via


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

L'exemple suivant indique comment créer une requête Parallel LINQ simple en utilisant la méthode d'extension AsParallel sur la séquence source et en exécutant la requête à l'aide de la méthode ForAll<TSource>.

RemarqueRemarque

Cette documentation utilise des expressions lambda pour définir des délégués en PLINQ.Si vous n'êtes pas familiarisé avec les expressions lambda en C# ou Visual Basic, consultez Expressions lambda en PLINQ et dans la bibliothèque parallèle de tâches.

Exemple

Sub SimpleQuery()

    Dim source = Enumerable.Range(100, 20000)

    ' Result sequence might be out of order.
    Dim parallelQuery = From num In source.AsParallel()
                            Where num Mod 10 = 0
                            Select num

    ' Process result sequence in parallel
    parallelQuery.ForAll(Sub(e)
                             DoSomething(e)
                         End Sub)

    ' Or use For Each to merge results first
    ' as in this example, Where results must
    ' be serialized sequentially through static Console method.
    For Each n In parallelQuery
        Console.Write("{0} ", n)
    Next

    ' You can also use ToArray, ToList, etc
    ' as with LINQ to Objects.
    Dim parallelQuery2 = (From num In source.AsParallel()
                              Where num Mod 10 = 0
                              Select num).ToArray()

    'Method syntax is also supported
    Dim parallelQuery3 = source.AsParallel().Where(Function(n)
                                                       Return (n Mod 10) = 0
                                                   End Function).Select(Function(n)
                                                                            Return n

                                                                        End Function)

    For Each i As Integer In parallelQuery3
        Console.Write("{0} ", i)
    Next
    Console.ReadLine()

End Sub

' A toy function to demonstrate syntax. Typically you need a more
' computationally expensive method to see speedup over sequential queries.
Sub DoSomething(ByVal i As Integer)
    Console.Write("{0:###.## }", Math.Sqrt(i))
End Sub
            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);

Cet exemple montre le modèle de base pour la création et l'exécution de toute requête Parallel LINQ lorsque le classement de la séquence de résultat n'est pas important ; les requêtes non classées sont généralement plus rapides que les requêtes classées. Les 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 des facteurs externes tels que la façon dont le système d'exploitation planifie chaque thread. Cet exemple est destiné à montrer l'utilisation et 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.

Compilation du code

  • Créez un projet d'application console.

  • Collez l'exemple de code après la méthode Main.

  • Ajoutez un appel à SimpleQuery à partir de Main, puis appuyez sur F5.

Voir aussi

Concepts

Parallel LINQ (PLINQ)

Historique des modifications

Date

Historique

Motif

Mai 2010

Remarque ajoutée concernant l'utilisation et l'accélération.

Commentaires client.