Поделиться через


Практическое руководство. Создание и выполнение простого запроса 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.

См. также

Основные понятия

Parallel LINQ (PLINQ)

Журнал изменений

Дата

Журнал

Причина

Май 2010

Добавлено примечание о сравнении использования и ускорения.

Обратная связь от клиента.