다음을 통해 공유


방법: 간단한 PLINQ 쿼리 만들기 및 실행

업데이트: 2010년 5월

다음 예제에서는 소스 시퀀스에서 AsParallel 확장 메서드를 사용하여 간단한 병렬 LINQ 쿼리를 만들고, ForAll<TSource> 메서드를 사용하여 이 쿼리를 실행하는 방법을 보여 줍니다.

참고참고

이 문서에서는 람다 식을 사용하여 PLINQ에 대리자를 정의합니다.C# 또는 Visual Basic의 람다 식에 익숙하지 않으면 PLINQ 및 TPL의 람다 식을 참조하십시오.

예제

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 메서드 뒤에 붙여넣습니다.

  • Main에서 SimpleQuery에 대한 호출을 추가하고 F5 키를 누릅니다.

참고 항목

개념

PLINQ(병렬 LINQ)

변경 기록

날짜

변경 내용

이유

2010년 5월

사용법과 속도 향상에 대한 설명을 추가했습니다.

고객 의견