ParallelLoopState ParallelLoopState ParallelLoopState ParallelLoopState Class

定義

他のイテレーションと対話するように、並列ループのイテレーションを有効にします。Enables iterations of parallel loops to interact with other iterations. このクラスのインスタンスは、Parallel クラスから各ループに提供されるため、コードでインスタンスを作成することはできません。An instance of this class is provided by the Parallel class to each loop; you can not create instances in your code.

public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
継承
ParallelLoopStateParallelLoopStateParallelLoopStateParallelLoopState

次の例では、ループの最大100の反復処理を並列実行します。The following example executes up to 100 iterations of a loop in parallel. 各イテレーションは、1 ~ 1000 ミリ秒のランダムな間隔で一時停止します。Each iteration pauses for a random interval from 1 to 1,000 milliseconds. ランダムに生成された値によって、 Breakメソッドが呼び出されるループの反復処理が決定されます。A randomly generated value determines on which iteration of the loop the Break method is called. この例の出力に示されているように、インデックスがLowestBreakIterationプロパティ値よりも大きいイテレーションは、メソッドのBreak呼び出しの後に開始されません。As the output from the example shows, no iterations whose index is greater than the LowestBreakIteration property value start after the call to the Break method.

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);
      Nullable<long> lowest = new Nullable<long>();

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

      var result = Parallel.For(1, 101, (i, state) => {
                                            Console.WriteLine("Beginning iteration {0}", i);
                                            int delay;
                                            Monitor.Enter(rnd);
                                               delay = rnd.Next(1, 1001);
                                            Monitor.Exit(rnd);
                                            Thread.Sleep(delay);
                                            
                                            if (state.ShouldExitCurrentIteration) {
                                               if (state.LowestBreakIteration < i)
                                                  return;
                                            }

                                            if (i == breakIndex) {
                                               Console.WriteLine("Break in iteration {0}", i);
                                               state.Break();
                                               if (state.LowestBreakIteration.HasValue)
                                                  if (lowest < state.LowestBreakIteration)
                                                     lowest = state.LowestBreakIteration;
                                                  else
                                                     lowest = state.LowestBreakIteration;
                                            }

                                            Console.WriteLine("Completed iteration {0}", i);
                                       });
         if (lowest.HasValue)
            Console.WriteLine("\nLowest Break Iteration: {0}", lowest);
         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イテレーションがメソッドを呼び出したかどうかを確認します。Because iterations of the loop are still likely to be executing when the Break method is called, each iteration calls the ShouldExitCurrentIteration property to check whether another iteration has called the Break method. プロパティ値がtrueの場合、イテレーションはLowestBreakIterationプロパティの値をチェックし、現在のイテレーションのインデックス値よりも大きい場合は、すぐにを返します。If the property value is true, the iteration checks the value of the LowestBreakIteration property and, if it is greater than the current iteration's index value, returns immediately.

注釈

このクラスのインスタンスをインスタンス化することはできないことに注意してください。Note that you cannot instantiate an instance of this class. これは、コンパイラによって、メソッドまたはParallel.For Parallel.ForEachメソッドの呼び出しの引数として自動的に生成されます。It is automatically generated by the compiler as an argument in a call to the Parallel.For or Parallel.ForEach method. 具体的な例を次に示します。The example provides an illustration.

for C#And (foreach in)およびFor andFor Each (in Visual Basic) などの構造体は、最も小さいインデックスから最も大きい値に、またはセット内の最初のオブジェクトから最後のまで順番に実行されます。Constructs such as for and foreach (in C#) and For and For Each (in Visual Basic) execute sequentially from the lowest index to the highest or from the first object in a set to the last. これに対しParallel.Forて、 Parallel.ForEachメソッドとメソッドでは実行されません。In contrast, the Parallel.For and Parallel.ForEach methods do not. ループの個々のイテレーションは並列で実行されるため、開始と終了は任意の順序で実行できます。Because individual iterations of the loop run in parallel, they can begin and end in any order. クラスParallelLoopStateを使用すると、並列ループの個々のイテレーションが相互に対話できるようになります。The ParallelLoopState class allows individual iterations of parallel loops to interact with one another. クラスParallelLoopStateを使用すると、次のことができます。The ParallelLoopState class allows you to:

  • Stopメソッドを呼び出して、現在のイテレーションを終了し、追加のイテレーションが開始されないようにします。Exit the current iteration and prevent any additional iterations from starting by calling the Stop method. これは、既に実行を開始しているイテレーションには影響しません。This does not affect iterations that have already begun execution.

  • メソッドをBreak呼び出すことにより、現在のインデックスよりも大きいインデックスを持つ反復が実行されないようにします。Prevent any iterations with an index greater than the current index from executing by calling the Break method. これは、既に実行を開始しているイテレーションには影響しません。This does not affect iterations that have already begun execution.

  • IsExceptionalプロパティの値を取得することによって、ループの反復処理で例外が発生したかどうかを確認します。Determine whether an exception has occurred in any loop iteration by retrieving the value of the IsExceptional property.

  • プロパティの値を取得して、ループのStop反復処理によってメソッドが呼び出されたかどうかを確認します。 IsStoppedDetermine whether any iteration of the loop has called the Stop method by retrieving the value of the IsStopped property. このプロパティを使用すると、メソッドのStop呼び出しの前に開始したループの反復処理からを返すことができますが、まだ実行中であることはありません。You can use this property to return from iterations of the loop that started before the call to the Stop method but are still executing.

  • ループの反復処理でメソッドBreakまたはStopメソッドが呼び出されたかどうか、またはShouldExitCurrentIterationプロパティの値を取得することによって例外がスローされたかどうかを確認します。Determine whether any iteration of the loop has called the Break or Stop method or has thrown an exception by retrieving the value of the ShouldExitCurrentIteration property.

  • プロパティの値を取得することによって、 LowestBreakIteration Break が呼び出された反復処理のインデックスよりインデックスが大きい、実行時間の長いイテレーションから終了します。Exit from a long-running iteration whose index is greater than the index of an iteration in which Break was called by retrieving the value of the LowestBreakIteration property.

プロパティ

IsExceptional IsExceptional IsExceptional IsExceptional

ループのいずれかの反復処理がその反復処理によってハンドルされない例外をスローしたかどうかを示す値を取得します。Gets whether any iteration of the loop has thrown an exception that went unhandled by that iteration.

IsStopped IsStopped IsStopped IsStopped

ループのいずれかのイテレーションが Stop() メソッドを呼び出したかどうかを示す値を取得します。Gets whether any iteration of the loop has called the Stop() method.

LowestBreakIteration LowestBreakIteration LowestBreakIteration LowestBreakIteration

Break() を呼び出したループの反復処理のうち、最も下位の反復処理を取得します。Gets the lowest iteration of the loop from which Break() was called.

ShouldExitCurrentIteration ShouldExitCurrentIteration ShouldExitCurrentIteration ShouldExitCurrentIteration

この反復処理または他の反復処理からの要求に基づいて、ループの現在の反復処理を終了する必要があるかどうかを示す値を取得します。Gets whether the current iteration of the loop should exit based on requests made by this or other iterations.

メソッド

Break() Break() Break() Break()

現在のイテレーションの終了後、システムはできるだけ早く Parallel ループの実行を終了する必要があることを通知します。Communicates that the Parallel loop should cease execution of iterations beyond the current iteration at the system's earliest convenience.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(Inherited from Object)
Stop() Stop() Stop() Stop()

Parallel ループの実行をできるだけ早く終了する必要があることを通知します。Communicates that the Parallel loop should cease execution at the system's earliest convenience.

ToString() ToString() ToString() ToString()

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.

(Inherited from Object)

適用対象

スレッド セーフ

ParallelLoopStateインスタンスは、インスタンスが提供されたループの本体内でのみ使用されることを意図しています。A ParallelLoopState instance is meant to be used only within the body of the loop to which an instance was provided. 関連するループが終了した後ParallelLoopStateは、指定されたインスタンスを安全に使用できません。また、明示的に他のスレッドに渡すことも安全でもありません。また、これらのスレッドがいつでもアクセスできるようになります。It is not safe to use a provided ParallelLoopState instance after the associated loop ends, nor is it safe to explicitly hand it off to other threads and have those threads access it at any time. ループにParallelLoopState含まれる各スレッドには、別のインスタンスが提供されます。A different ParallelLoopState instance will be provided to each thread involved in a loop.

こちらもご覧ください