Практическое руководство. Создание и выполнение простого запроса PLINQ
В следующем примере показано, как создать простой параллельный запрос LINQ с помощью метода расширения AsParallel в исходной последовательности и выполнения запроса с использованием метода ForAll<TSource>.
![]() |
---|
В этой документации для определения делегатов в PLINQ используются лямбда-выражения.Сведения о лямбда-выражениях в C# или Visual Basic см. в разделе Лямбда-выражения в PLINQ и библиотеке параллельных задач. |
Пример
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);
В этом примере демонстрируется базовый шаблон для создания и выполнения любого параллельного запроса LINQ, если порядок полученной последовательности не имеет значения. Неупорядоченные запросы обычно выполняются быстрее, чем упорядоченные. Запрос разделяет источник на задачи, которые выполняются асинхронно в нескольких потоках. Порядок завершения каждой задачи зависит не только от объема работ, необходимых для обработки элементов в части, но и от внешних факторов, например того, как операционная система планирует каждый поток. Этот пример демонстрирует использование и может выполняться медленнее, чем аналогичный последовательный запрос LINQ to Objects. Дополнительные сведения об увеличении скорости см. в разделе Общее представление об ускорении выполнения в PLINQ. Дополнительные сведения о том, как сохранить порядок элементов в запросе, см. в разделе Практическое руководство. Управление порядком в запросе PLINQ.
Компиляция кода
Создание проекта консольного приложения
Вставьте пример кода после метода Main.
Добавьте вызов SimpleQuery из Main и нажмите F5.
См. также
Основные понятия
Журнал изменений
Дата |
Журнал |
Причина |
---|---|---|
Май 2010 |
Добавлено примечание о сравнении использования и ускорения. |
Обратная связь от клиента. |