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>.
Remarque |
---|
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
Historique des modifications
Date |
Historique |
Motif |
---|---|---|
Mai 2010 |
Remarque ajoutée concernant l'utilisation et l'accélération. |
Commentaires client. |