ParallelLoopState 클래스

정의

병렬 루프의 반복이 다른 반복과 상호 작용할 수 있도록 합니다. 이 클래스의 인스턴스는 Parallel 클래스에 의해 각 루프에 제공됩니다. 코드에 인스턴스를 만들 수는 없습니다.

public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
상속
ParallelLoopState

예제

다음 예제에서는 루프를 최대 100회 병렬로 실행합니다. 각 반복은 1~1,000밀리초의 임의 간격으로 일시 중지됩니다. 임의로 생성된 값은 메서드가 호출되는 루프의 반복을 Break 결정합니다. 예제의 출력에서 보여 주듯이 인덱스가 속성 값보다 LowestBreakIteration 큰 반복은 메서드 호출 Break 후에 시작되지 않습니다.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
    public static void Main()
    {
        var rnd = new Random();
        int breakIndex = rnd.Next(1, 11);

        Console.WriteLine($"Will call Break at iteration {breakIndex}\n");

        var result = Parallel.For(1, 101, (i, state) => 
        {
            Console.WriteLine($"Beginning iteration {i}");
            int delay;
            lock (rnd)
                delay = rnd.Next(1, 1001);
            Thread.Sleep(delay);

            if (state.ShouldExitCurrentIteration)
            {
                if (state.LowestBreakIteration < i)
                    return;
            }

            if (i == breakIndex)
            {
                Console.WriteLine($"Break in iteration {i}");
                state.Break();
            }

            Console.WriteLine($"Completed iteration {i}");
        });

        if (result.LowestBreakIteration.HasValue)
            Console.WriteLine($"\nLowest Break Iteration: {result.LowestBreakIteration}");
        else
            Console.WriteLine($"\nNo lowest break iteration.");
    }
}
// The example displays output like the following:
//       Will call Break at iteration 8
//
//       Beginning iteration 1
//       Beginning iteration 13
//       Beginning iteration 97
//       Beginning iteration 25
//       Beginning iteration 49
//       Beginning iteration 37
//       Beginning iteration 85
//       Beginning iteration 73
//       Beginning iteration 61
//       Completed iteration 85
//       Beginning iteration 86
//       Completed iteration 61
//       Beginning iteration 62
//       Completed iteration 86
//       Beginning iteration 87
//       Completed iteration 37
//       Beginning iteration 38
//       Completed iteration 38
//       Beginning iteration 39
//       Completed iteration 25
//       Beginning iteration 26
//       Completed iteration 26
//       Beginning iteration 27
//       Completed iteration 73
//       Beginning iteration 74
//       Completed iteration 62
//       Beginning iteration 63
//       Completed iteration 39
//       Beginning iteration 40
//       Completed iteration 40
//       Beginning iteration 41
//       Completed iteration 13
//       Beginning iteration 14
//       Completed iteration 1
//       Beginning iteration 2
//       Completed iteration 97
//       Beginning iteration 98
//       Completed iteration 49
//       Beginning iteration 50
//       Completed iteration 87
//       Completed iteration 27
//       Beginning iteration 28
//       Completed iteration 50
//       Beginning iteration 51
//       Beginning iteration 88
//       Completed iteration 14
//       Beginning iteration 15
//       Completed iteration 15
//       Completed iteration 2
//       Beginning iteration 3
//       Beginning iteration 16
//       Completed iteration 63
//       Beginning iteration 64
//       Completed iteration 74
//       Beginning iteration 75
//       Completed iteration 41
//       Beginning iteration 42
//       Completed iteration 28
//       Beginning iteration 29
//       Completed iteration 29
//       Beginning iteration 30
//       Completed iteration 98
//       Beginning iteration 99
//       Completed iteration 64
//       Beginning iteration 65
//       Completed iteration 42
//       Beginning iteration 43
//       Completed iteration 88
//       Beginning iteration 89
//       Completed iteration 51
//       Beginning iteration 52
//       Completed iteration 16
//       Beginning iteration 17
//       Completed iteration 43
//       Beginning iteration 44
//       Completed iteration 44
//       Beginning iteration 45
//       Completed iteration 99
//       Beginning iteration 4
//       Completed iteration 3
//       Beginning iteration 8
//       Completed iteration 4
//       Beginning iteration 5
//       Completed iteration 52
//       Beginning iteration 53
//       Completed iteration 75
//       Beginning iteration 76
//       Completed iteration 76
//       Beginning iteration 77
//       Completed iteration 65
//       Beginning iteration 66
//       Completed iteration 5
//       Beginning iteration 6
//       Completed iteration 89
//       Beginning iteration 90
//       Completed iteration 30
//       Beginning iteration 31
//       Break in iteration 8
//       Completed iteration 8
//       Completed iteration 6
//       Beginning iteration 7
//       Completed iteration 7
//
//       Lowest Break Iteration: 8
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim rnd As New Random()
      Dim breakIndex As Integer = rnd.Next(1, 11)
      Dim lowest As New Nullable(Of Long)()

      Console.WriteLine("Will call Break at iteration {0}", breakIndex)
      Console.WriteLine()

      Dim result = Parallel.For(1, 101, Sub(i, state)
                                            Console.WriteLine("Beginning iteration {0}", i)
                                            Dim delay As Integer
                                            Monitor.Enter(rnd)
                                               delay = rnd.Next(1, 1001)
                                            Monitor.Exit(rnd)
                                            Thread.Sleep(delay)

                                            If state.ShouldExitCurrentIteration Then
                                               If state.LowestBreakIteration < i Then
                                                  Return
                                               End If
                                            End If

                                            If i = breakIndex Then
                                               Console.WriteLine("Break in iteration {0}", i)
                                               state.Break()
                                               If state.LowestBreakIteration.HasValue Then
                                                  If lowest < state.LowestBreakIteration Then
                                                     lowest = state.LowestBreakIteration
                                                  Else
                                                     lowest = state.LowestBreakIteration
                                                  End If
                                               End If
                                            End If

                                            Console.WriteLine("Completed iteration {0}", i)
                                       End Sub )
         Console.WriteLine()
         If lowest.HasValue Then
            Console.WriteLine("Lowest Break Iteration: {0}", lowest)
         Else
            Console.WriteLine("No lowest break iteration.")
         End If
   End Sub
End Module
' The example displays output like the following:
'       Will call Break at iteration 8
'
'       Beginning iteration 1
'       Beginning iteration 13
'       Beginning iteration 97
'       Beginning iteration 25
'       Beginning iteration 49
'       Beginning iteration 37
'       Beginning iteration 85
'       Beginning iteration 73
'       Beginning iteration 61
'       Completed iteration 85
'       Beginning iteration 86
'       Completed iteration 61
'       Beginning iteration 62
'       Completed iteration 86
'       Beginning iteration 87
'       Completed iteration 37
'       Beginning iteration 38
'       Completed iteration 38
'       Beginning iteration 39
'       Completed iteration 25
'       Beginning iteration 26
'       Completed iteration 26
'       Beginning iteration 27
'       Completed iteration 73
'       Beginning iteration 74
'       Completed iteration 62
'       Beginning iteration 63
'       Completed iteration 39
'       Beginning iteration 40
'       Completed iteration 40
'       Beginning iteration 41
'       Completed iteration 13
'       Beginning iteration 14
'       Completed iteration 1
'       Beginning iteration 2
'       Completed iteration 97
'       Beginning iteration 98
'       Completed iteration 49
'       Beginning iteration 50
'       Completed iteration 87
'       Completed iteration 27
'       Beginning iteration 28
'       Completed iteration 50
'       Beginning iteration 51
'       Beginning iteration 88
'       Completed iteration 14
'       Beginning iteration 15
'       Completed iteration 15
'       Completed iteration 2
'       Beginning iteration 3
'       Beginning iteration 16
'       Completed iteration 63
'       Beginning iteration 64
'       Completed iteration 74
'       Beginning iteration 75
'       Completed iteration 41
'       Beginning iteration 42
'       Completed iteration 28
'       Beginning iteration 29
'       Completed iteration 29
'       Beginning iteration 30
'       Completed iteration 98
'       Beginning iteration 99
'       Completed iteration 64
'       Beginning iteration 65
'       Completed iteration 42
'       Beginning iteration 43
'       Completed iteration 88
'       Beginning iteration 89
'       Completed iteration 51
'       Beginning iteration 52
'       Completed iteration 16
'       Beginning iteration 17
'       Completed iteration 43
'       Beginning iteration 44
'       Completed iteration 44
'       Beginning iteration 45
'       Completed iteration 99
'       Beginning iteration 4
'       Completed iteration 3
'       Beginning iteration 8
'       Completed iteration 4
'       Beginning iteration 5
'       Completed iteration 52
'       Beginning iteration 53
'       Completed iteration 75
'       Beginning iteration 76
'       Completed iteration 76
'       Beginning iteration 77
'       Completed iteration 65
'       Beginning iteration 66
'       Completed iteration 5
'       Beginning iteration 6
'       Completed iteration 89
'       Beginning iteration 90
'       Completed iteration 30
'       Beginning iteration 31
'       Break in iteration 8
'       Completed iteration 8
'       Completed iteration 6
'       Beginning iteration 7
'       Completed iteration 7
'
'       Lowest Break Iteration: 8

루프의 반복은 메서드가 호출될 때 Break 실행될 가능성이 높기 때문에 각 반복은 속성을 호출 ShouldExitCurrentIteration 하여 다른 반복에서 메서드를 호출 Break 했는지 여부를 확인합니다. 속성 값이면 반복에서 true속성 값을 확인하고 현재 반복의 LowestBreakIteration 인덱스 값보다 크면 즉시 반환됩니다.

설명

이 클래스의 인스턴스를 인스턴스화할 수 없습니다. 컴파일러가 또는 Parallel.ForEach 메서드를 호출 Parallel.For 할 때 인수로 자동으로 생성됩니다. 예제에서는 그림을 제공합니다.

C#, for foreach (Visual Basic) For For Each 같은 구문은 가장 낮은 인덱스에서 가장 높은 인덱스로 또는 집합의 첫 번째 개체에서 마지막 개체까지 순차적으로 실행됩니다. 반면, 메서드와 Parallel.ForEach 메서드는 Parallel.For 그렇지 않습니다. 루프의 개별 반복은 병렬로 실행되므로 순서에 따라 시작 및 종료할 수 있습니다. 이 ParallelLoopState 클래스를 사용하면 병렬 루프의 개별 반복이 서로 상호 작용할 수 있습니다. 클래스를 ParallelLoopState 사용하면 다음을 수행할 수 있습니다.

  • 현재 반복을 종료하고 메서드를 호출 Stop 하여 추가 반복이 시작되지 않도록 합니다. 이미 실행을 시작한 반복에는 영향을 주지 않습니다.

  • 현재 인덱스보다 큰 인덱스가 있는 반복이 메서드를 호출 Break 하여 실행되지 않도록 합니다. 이미 실행을 시작한 반복에는 영향을 주지 않습니다.

  • 속성 값을 IsExceptional 검색하여 루프 반복에서 예외가 발생했는지 여부를 확인합니다.

  • 루프의 반복이 속성 값을 IsStopped 검색하여 메서드를 Stop 호출했는지 여부를 확인합니다. 이 속성을 사용 하 여 메서드를 호출 하기 전에 시작 하지만 여전히 실행 중인 루프의 반복에서 반환할 Stop 수 있습니다.

  • 루프의 반복이 해당 또는 메서드를 Break 호출했는지 또는 Stop 속성 값을 ShouldExitCurrentIteration 검색하여 예외를 throw했는지 확인합니다.

  • 속성 값을 LowestBreakIteration 검색하여 Break가 호출된 반복의 인덱스보다 인덱스가 큰 장기 실행 반복에서 종료합니다.

속성

IsExceptional

루프 반복이 해당 반복에서 처리되지 않은 예외를 throw했는지 여부를 가져옵니다.

IsStopped

루프 반복에서 Stop() 메서드를 호출했는지 여부를 가져옵니다.

LowestBreakIteration

Break()가 호출된 루프의 가장 낮은 반복을 가져옵니다.

ShouldExitCurrentIteration

루프의 현재 반복이 해당 반복 또는 다른 반복에서 수행한 요청에 따라 종료되어야 하는지 여부를 가져옵니다.

메서드

Break()

시스템의 편의상 빨리 수행하는 현재 반복 이외에 Parallel 루프의 실행이 중단되도록 통신합니다.

Equals(Object)

지정된 개체가 현재 개체와 같은지 확인합니다.

(다음에서 상속됨 Object)
GetHashCode()

기본 해시 함수로 작동합니다.

(다음에서 상속됨 Object)
GetType()

현재 인스턴스의 Type을 가져옵니다.

(다음에서 상속됨 Object)
MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.

(다음에서 상속됨 Object)
Stop()

시스템에서 편의상 빨리 수행하는 반복에서 Parallel 루프의 실행이 중단되도록 통신합니다.

ToString()

현재 개체를 나타내는 문자열을 반환합니다.

(다음에서 상속됨 Object)

적용 대상

스레드 보안

ParallelLoopState 인스턴스는 인스턴스가 제공된 루프의 본문 내에서만 사용됩니다. 연결된 루프가 종료된 후 제공된 ParallelLoopState 인스턴스를 사용하는 것은 안전하지 않으며, 명시적으로 다른 스레드에 전달하여 해당 스레드가 언제든지 액세스하도록 하는 것도 안전하지 않습니다. 루프에 관련된 각 스레드에 다른 ParallelLoopState 인스턴스가 제공됩니다.

추가 정보