Partager via


ParallelLoopState Classe

Définition

Permet aux itérations de boucles parallèles d’interagir avec d’autres itérations. Une instance de cette classe est fournie par la classe Parallel à chaque boucle ; vous ne pouvez pas créer d'instances dans votre code utilisateur.

public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
Héritage
ParallelLoopState

Exemples

L’exemple suivant exécute jusqu’à 100 itérations d’une boucle en parallèle. Chaque itération s’interrompt pour un intervalle aléatoire de 1 à 1 000 millisecondes. Une valeur générée de manière aléatoire détermine sur quelle itération de la boucle la Break méthode est appelée. Comme le montre la sortie de l’exemple, aucune itération dont l’index est supérieur au début de la LowestBreakIteration valeur de propriété après l’appel à la Break méthode.

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

Étant donné que les itérations de la boucle sont toujours susceptibles d’être exécutées lorsque la Break méthode est appelée, chaque itération appelle la ShouldExitCurrentIteration propriété pour vérifier si une autre itération a appelé la Break méthode. Si la valeur de la propriété est true, l’itération vérifie la valeur de la LowestBreakIteration propriété et, si elle est supérieure à la valeur d’index de l’itération actuelle, retourne immédiatement.

Remarques

Notez que vous ne pouvez pas instancier une instance de cette classe. Il est généré automatiquement par le compilateur en tant qu’argument dans un appel à la ou Parallel.ForEach à la Parallel.For méthode. Cet exemple en fournit une illustration.

Les constructions telles que for et foreach (en C#) et For Each For (en Visual Basic) s’exécutent de manière séquentielle à partir de l’index le plus bas vers le plus élevé ou du premier objet d’un jeu à la dernière. En revanche, les méthodes et Parallel.ForEach les Parallel.For méthodes ne le font pas. Étant donné que les itérations individuelles de la boucle s’exécutent en parallèle, elles peuvent commencer et se terminer dans n’importe quel ordre. La ParallelLoopState classe permet aux itérations individuelles de boucles parallèles d’interagir entre elles. La ParallelLoopState classe vous permet de :

  • Quittez l’itération actuelle et empêchez les itérations supplémentaires de commencer en appelant la Stop méthode. Cela n’affecte pas les itérations qui ont déjà commencé l’exécution.

  • Empêchez les itérations avec un index supérieur à l’index actuel de s’exécuter en appelant la Break méthode. Cela n’affecte pas les itérations qui ont déjà commencé l’exécution.

  • Déterminez si une exception s’est produite dans une itération de boucle en récupérant la valeur de la IsExceptional propriété.

  • Déterminez si une itération de la boucle a appelé la Stop méthode en récupérant la valeur de la IsStopped propriété. Vous pouvez utiliser cette propriété pour retourner des itérations de la boucle qui ont démarré avant l’appel à la Stop méthode, mais qui sont toujours en cours d’exécution.

  • Déterminez si une itération de la boucle a appelé ou Break Stop méthode ou a levée une exception en récupérant la valeur de la ShouldExitCurrentIteration propriété.

  • Quittez une itération de longue durée dont l’index est supérieur à l’index d’une itération dans laquelle Break a été appelé en récupérant la valeur de la LowestBreakIteration propriété.

Propriétés

IsExceptional

Indique si une itération de la boucle a levé une exception qui n'a pas été gérée par cette itération.

IsStopped

Indique si une itération de la boucle a appelé la méthode Stop().

LowestBreakIteration

Obtient l'itération la plus basse de la boucle d'où Break() a été appelé.

ShouldExitCurrentIteration

Indique si l'itération actuelle de la boucle doit s'arrêter en fonction des requêtes effectuées par cette itération ou d'autres.

Méthodes

Break()

Indique que l’exécution de la boucle Parallel doit s’arrêter après l’itération actuelle dès que le système le peut.

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

(Hérité de Object)
GetHashCode()

Fait office de fonction de hachage par défaut.

(Hérité de Object)
GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
Stop()

Indique que l'exécution de la boucle Parallel doit s'arrêter dès que le système le peut.

ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

S’applique à

Cohérence de thread

Une ParallelLoopState instance est destinée à être utilisée uniquement dans le corps de la boucle à laquelle une instance a été fournie. Il n’est pas sûr d’utiliser une instance fournie ParallelLoopState après la fin de la boucle associée, ni de le remettre explicitement à d’autres threads et d’y accéder à tout moment. Une instance différente ParallelLoopState est fournie à chaque thread impliqué dans une boucle.

Voir aussi