次の方法で共有


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生成されます。 具体的な例を次に示します。

foreach (C#では) や For EachFor (Visual Basic では) などのforコンストラクトは、最も低いインデックスから最も高いインデックス、またはセット内の最初のオブジェクトから最後の オブジェクトまで順番に実行されます。 これに対し Parallel.For 、 メソッドと Parallel.ForEach メソッドはしません。 ループの個々の反復は並列で実行されるため、開始と終了は任意の順序で行うことができます。 クラスを ParallelLoopState 使用すると、並列ループの個々の反復を相互に操作できます。 クラスを ParallelLoopState 使用すると、次のことができます。

  • 現在のイテレーションを終了し、 メソッドを呼び出すことで追加のイテレーションが開始されないようにします Stop 。 これは、既に実行が開始されているイテレーションには影響しません。

  • メソッドを呼び出して、現在のインデックスより大きいインデックスを持つイテレーションが実行されないようにします Break 。 これは、既に実行が開始されているイテレーションには影響しません。

  • プロパティの値 IsExceptional を取得して、ループイテレーションで例外が発生したかどうかを判断します。

  • プロパティの値IsStoppedを取得して、ループの繰り返しで メソッドがStop呼び出されたかどうかを判断します。 このプロパティを使用すると、メソッドの呼び出し前に開始されたが、まだ実行中のループの Stop 繰り返しから戻ることができます。

  • ループの反復で または メソッドが呼び出BreakStopされたか、 プロパティの値ShouldExitCurrentIterationを取得して例外がスローされたかどうかを判断します。

  • プロパティの値を取得して Break が呼び出されたイテレーションのインデックスよりもインデックスが大きい、実行時間の LowestBreakIteration 長いイテレーションから終了します。

プロパティ

IsExceptional

ループのいずれかのイテレーションが、そのイテレーションによって処理されなかった例外をスローしたかどうかを示す値を取得します。

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 インスタンスが提供されます。

こちらもご覧ください