Freigeben über


ParallelLoopState Klasse

Definition

Ermöglicht Iterationen von parallelen Schleifen die Interaktion mit anderen Iterationen. Eine Instanz dieser Klasse wird von der Parallel-Klasse für jede Schleife bereitgestellt. Sie können keine Instanzen im Code erstellen.

public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
Vererbung
ParallelLoopState

Beispiele

Im folgenden Beispiel werden bis zu 100 Iterationen einer Schleife parallel ausgeführt. Jede Iteration hält für ein zufälliges Intervall von 1 bis 1.000 Millisekunden an. Ein zufällig generierter Wert bestimmt, welche Iteration der Schleife aufgerufen Break wird. Wie die Ausgabe aus dem Beispiel gezeigt wird, werden keine Iterationen, deren Index größer als der LowestBreakIteration Eigenschaftswert ist, nach dem Aufruf der Break Methode gestartet.

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

Da Iterationen der Schleife immer noch ausgeführt werden, wenn die Break Methode aufgerufen wird, ruft jede Iteration die ShouldExitCurrentIteration Eigenschaft auf, um zu überprüfen, ob eine andere Iteration die Break Methode aufgerufen hat. Wenn der Eigenschaftswert lautet true, überprüft die Iteration den Wert der LowestBreakIteration Eigenschaft, und wenn sie größer als der Indexwert der aktuellen Iteration ist, wird sofort zurückgegeben.

Hinweise

Beachten Sie, dass Sie eine Instanz dieser Klasse nicht instanziieren können. Es wird automatisch vom Compiler als Argument in einem Aufruf der Parallel.For Methode Parallel.ForEach generiert. Dies wird im Beispiel veranschaulicht.

Konstrukte wie for z. B. und foreach (in C#) und For For Each (in Visual Basic) werden sequenziell vom niedrigsten Index bis zum höchsten oder vom ersten Objekt in einem Satz bis zum letzten ausgeführt. Im Gegensatz dazu sind die Parallel.For Methoden und Parallel.ForEach Methoden nicht zulässig. Da einzelne Iterationen der Schleife parallel ausgeführt werden, können sie in jeder Reihenfolge beginnen und enden. Mit der ParallelLoopState Klasse können einzelne Iterationen paralleler Schleifen miteinander interagieren. Die ParallelLoopState Klasse ermöglicht Folgendes:

  • Beenden Sie die aktuelle Iteration, und verhindern Sie, dass zusätzliche Iterationen beginnen, indem Sie die Stop Methode aufrufen. Dies wirkt sich nicht auf Iterationen aus, die bereits mit der Ausführung begonnen haben.

  • Verhindern Sie, dass Iterationen mit einem Index größer als der aktuelle Index werden, indem Sie die Break Methode aufrufen. Dies wirkt sich nicht auf Iterationen aus, die bereits mit der Ausführung begonnen haben.

  • Bestimmen Sie, ob eine Ausnahme in jeder Schleifen-Iteration aufgetreten ist, indem Sie den Wert der IsExceptional Eigenschaft abrufen.

  • Bestimmen Sie, ob eine Iteration der Schleife die Stop Methode aufgerufen hat, indem Sie den Wert der IsStopped Eigenschaft abrufen. Sie können diese Eigenschaft verwenden, um von Iterationen der Schleife zurückzugeben, die vor dem Aufruf der Stop Methode gestartet wurde, aber noch ausgeführt werden.

  • Bestimmen Sie, ob eine Iteration der Schleife die Break Oder-Methode Stop aufgerufen oder eine Ausnahme ausgelöst hat, indem Sie den Wert der ShouldExitCurrentIteration Eigenschaft abrufen.

  • Beenden Sie eine lang ausgeführte Iteration, deren Index größer als der Index einer Iteration ist, in der Break aufgerufen wurde, indem der Wert der LowestBreakIteration Eigenschaft abgerufen wird.

Eigenschaften

IsExceptional

Ruft einen Wert ab, der angibt, ob eine Iteration der Schleife eine Ausnahme ausgelöst hat, die nicht durch diese Iteration behandelt wurde.

IsStopped

Ruft einen Wert ab, der angibt, ob eine Iteration der Schleife die Stop()-Methode aufgerufen hat.

LowestBreakIteration

Ruft die niedrigste Iteration der Schleife ab, aus der Break() aufgerufen wurde.

ShouldExitCurrentIteration

Ruft einen Wert ab, der angibt, ob die aktuelle Iteration der Schleife basierend auf Anforderungen dieser oder anderer Iterationen beendet werden soll.

Methoden

Break()

Gibt an, dass die Parallel-Schleife die Ausführung von Iterationen nach der aktuellen Iteration beenden soll, sobald dies dem System möglich ist.

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
Stop()

Gibt an, dass die Parallel-Schleife die Ausführung beenden soll, sobald dies dem System möglich ist.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für

Threadsicherheit

Eine ParallelLoopState Instanz soll nur im Textkörper der Schleife verwendet werden, für die eine Instanz bereitgestellt wurde. Es ist nicht sicher, eine bereitgestellte ParallelLoopState Instanz nach Beendigung der zugeordneten Schleife zu verwenden, noch ist es sicher, sie explizit an andere Threads zu übergeben und diese Threads jederzeit darauf zugreifen zu lassen. Für jeden in einer Schleife beteiligten Thread wird eine andere ParallelLoopState Instanz bereitgestellt.

Siehe auch