Como: Criar e executar uma consulta simples PLINQ
O exemplo a seguir mostra como criar uma consulta LINQ paralelo simples usando o AsParallel o método de extensão sobre a seqüência de origem e executar a consulta usando o ForAll<TSource> método.
Observação
Esta documentação usa expressões lambda para definir os delegados no PLINQ.Se você não estiver familiarizado com as expressões lambda em C# ou Visual Basic, consulte Expressões lambda no PLINQ e TPL.
Exemplo
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);
Este exemplo demonstra o padrão básico para criar e executar qualquer consulta LINQ paralelo quando a ordem da seqüência de resultado não é importante; as consultas não ordenadas são geralmente mais rápidas do que as consultas ordenadas. A consulta partições a fonte em tarefas que são executadas de forma assíncrona em vários segmentos. A ordem na qual cada tarefa é concluída depende não apenas a quantidade de trabalho envolvido processar os elementos na partição, mas também fatores externos como, por exemplo, como o sistema operacional agenda cada thread. Este exemplo destina-se para demonstrar o uso e pode não ser executado mais rápido do que o equivalente LINQ to Objects seqüencial de consulta de. Para obter mais informações sobre o aumento de velocidade, consulte Aumento de velocidade de compreensão no PLINQ. Para obter mais informações sobre como preservar a ordenação dos elementos em uma consulta, consulte Como: Controle de pedidos em uma consulta PLINQ.
Compilando o código
Criar um projeto de aplicativo de console
Cole o exemplo de código após o método Main.
Adicionar uma chamada para SimpleQuery de principal e pressione F5.
Consulte também
Conceitos
Histórico de alterações
Date |
History |
Motivo |
---|---|---|
Maio de 2010 |
Observação adicionada referentes ao uso vs. aumento de velocidade. |
Comentários do cliente. |