>백엔드 개발 >C#.Net 튜토리얼 >C# 병렬 작업의 Parallel 클래스에 대한 소개 예제

C# 병렬 작업의 Parallel 클래스에 대한 소개 예제

零下一度
零下一度원래의
2017-06-23 15:13:392271검색

1. 병렬 클래스

병렬 클래스는 데이터 및 작업 병렬성을 제공합니다.

2. Paraller.For()

Paraller.For() 메서드는 C#의 for 루프 문과 유사하며 작업을 여러 번 실행합니다. . Paraller.For() 메서드를 사용하여 반복을 병렬로 실행할 수 있습니다. 반복 순서는 정의되지 않습니다.

For() 메서드에서 처음 두 매개 변수는 고정되어 있으며 이 두 매개 변수는 루프의 시작과 끝을 정의합니다. 먼저 첫 번째 메서드 For(int,int,Action)를 설명합니다. 처음 두 매개변수는 루프의 시작과 도입을 나타냅니다. 세 번째 매개변수는 루프의 반복 횟수입니다. 매개변수가 전달됩니다. 위임자에게 제공된 메서드입니다. Paraller.For() 메서드의 반환 유형은 루프가 종료되었는지 여부와 가장 낮은 반복의 인덱스(Break 문이 호출된 가장 낮은 반복을 나타내는 정수를 반환함)에 대한 정보를 제공하는 ParallelLoopResult 구조입니다. 먼저 예제를 작성해 보겠습니다.

            ParallelLoopResult result = Parallel.For(0, 10, i =>{
                Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            });

            Console.WriteLine("是否完成:{0}", result.IsCompleted);
            Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);

출력 결과는 다음과 같습니다.

보시다시피 대리자 메서드가 10번 실행되었으며 순서를 보장할 수 없습니다. 하지만 가장 낮은 반복에 대해서는 데이터가 나오지 않습니다. 이는 Break 문을 호출하는 가장 낮은 반복의 정수를 반환하기 때문입니다. 실행 중에 For() 메서드를 조기에 중단해야 하는 경우 ParallelLoopState를 사용하여 For(int,int,Action)를 구현할 수 있습니다. 위의 예를 변경합니다.

            ParallelLoopResult result = Parallel.For(0, 10, (i, state) =>{
                Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);if (i > 5)
                    state.Break();
            });

            Console.WriteLine("是否完成:{0}", result.IsCompleted);
            Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);

출력 결과는 다음과 같습니다.

3. Parallel.ForEach()

Paraller.ForEach() 메서드는 IEnumerable을 구현하는 컬렉션을 순회하며 그 메서드는 유사합니다. foreach 문으로 이동하지만 비동기식으로 순회되며 순회 순서는 여기에서 결정되지 않습니다. 먼저 첫 번째 메서드인 Paraller.ForEach(IEnumerable,Action)를 설명하고 먼저 다음 예제를 살펴보세요.

            string[] data = { "str1", "str2", "str3" };
            ParallelLoopResult result = Parallel.ForEach<string>(data, str =>  {
                  Console.WriteLine(str);
              });
            Console.WriteLine("是否完成:{0}", result.IsCompleted);
            Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);

출력 결과는 다음과 같습니다.

또한 For와 같이 반복 횟수와 ParallelLoopState를 전달합니다. 메서드는 ForEach(IEnumerable source, Action body)입니다. 그런 다음 위의 예를 변경합니다.

            string[] data = { "str1", "str2", "str3", "str4", "str5" };
            ParallelLoopResult result = Parallel.ForEach<string>(data, (str, state, i) =>  {
                  Console.WriteLine("迭代次数:{0},{1}", i, str);                  if (i > 3)
                      state.Break();
              });
            Console.WriteLine("是否完成:{0}", result.IsCompleted);
            Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);

출력 결과는 다음과 같습니다.

4. Parallel.Invoke()

작업 병렬 모드를 제공하는 Parallel.Invoke() 메서드입니다. Paraller.Invoke() 메서드를 사용하면 실행해야 하는 메서드를 지정할 수 있는 Action 대리자 배열을 전달할 수 있습니다. 아래 예를 참조하세요.

            Parallel.Invoke(() =>{
                Thread.Sleep(100);
                Console.WriteLine("method1");
            }, () =>{
                Thread.Sleep(10);
                Console.WriteLine("method2");
            });

출력 결과는 다음과 같습니다.

5. 결론

Parallel.For() Paraller.ForEach() 메서드는 각 반복에서 동일한 코드를 호출하는 반면 Parallel.Invoke() 메서드를 사용하면 여러 메서드를 동시에 호출할 수 있습니다. Parallel.ForEach()는 데이터 병렬 처리에 사용되고 Parallel.Invoke()는 작업 병렬 처리에 사용됩니다.

위 내용은 C# 병렬 작업의 Parallel 클래스에 대한 소개 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.