ParallelLoopState Clase

Definición

Permite las iteraciones de bucles paralelos para interactuar con otras iteraciones. La clase Parallel proporciona una instancia de esta clase a cada bucle; no se pueden crear instancias en el código.

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

Ejemplos

En el ejemplo siguiente se ejecutan hasta 100 iteraciones de un bucle en paralelo. Cada iteración se pausa para un intervalo aleatorio de 1 a 1000 milisegundos. Un valor generado aleatoriamente determina en qué iteración del bucle se llama al Break método. Como se muestra en la salida del ejemplo, no se inician iteraciones cuyo índice es mayor que el valor de propiedad LowestBreakIteration después de la llamada al Break método .

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

Dado que es probable que las iteraciones del bucle se ejecuten cuando se llama al Break método , cada iteración llama a la ShouldExitCurrentIteration propiedad para comprobar si otra iteración ha llamado al Break método . Si el valor de la propiedad es true, la iteración comprueba el valor de la LowestBreakIteration propiedad y, si es mayor que el valor de índice de la iteración actual, devuelve inmediatamente.

Comentarios

Tenga en cuenta que no se puede crear una instancia de esta clase. El compilador genera automáticamente como argumento en una llamada al Parallel.For método o Parallel.ForEach . En este ejemplo se ilustra.

Las construcciones como for y foreach (en C#) y For For Each (en Visual Basic) se ejecutan secuencialmente desde el índice más bajo hasta el más alto o desde el primer objeto de un conjunto en el último. Por el contrario, los Parallel.For métodos y Parallel.ForEach no. Dado que las iteraciones individuales del bucle se ejecutan en paralelo, pueden comenzar y finalizar en cualquier orden. La ParallelLoopState clase permite que las iteraciones individuales de bucles paralelos interactúen entre sí. La ParallelLoopState clase le permite:

  • Salga de la iteración actual y evite que se inicien iteraciones adicionales llamando al Stop método . Esto no afecta a las iteraciones que ya han comenzado a ejecutarse.

  • Evite que las iteraciones con un índice mayor que el índice actual se ejecuten llamando al Break método . Esto no afecta a las iteraciones que ya han comenzado a ejecutarse.

  • Determine si se ha producido una excepción en cualquier iteración de bucle recuperando el valor de la IsExceptional propiedad .

  • Determine si alguna iteración del bucle ha llamado al Stop método recuperando el valor de la IsStopped propiedad . Puede usar esta propiedad para devolver desde iteraciones del bucle que se inició antes de la llamada al Stop método, pero que todavía se está ejecutando.

  • Determine si alguna iteración del bucle ha llamado al Break método o Stop o ha producido una excepción recuperando el valor de la ShouldExitCurrentIteration propiedad .

  • Salga de una iteración de larga duración cuyo índice sea mayor que el índice de una iteración en la que se llamó a Break recuperando el valor de la LowestBreakIteration propiedad .

Propiedades

IsExceptional

Obtiene si alguna iteración del bucle causó una excepción que la iteración no controló.

IsStopped

Obtiene si alguna iteración del bucle llamó al método Stop().

LowestBreakIteration

Obtiene la iteración más baja del bucle desde el que se llamó a Break().

ShouldExitCurrentIteration

Obtiene si la iteración actual del bucle debe salir basándose en las solicitudes realizadas por esta u otras iteraciones.

Métodos

Break()

Comunica que, en cuanto pueda el sistema, el bucle Parallel debe cesar la ejecución de iteraciones después de la iteración actual.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
Stop()

Comunica que el bucle Parallel debe cesar la ejecución en cuanto pueda el sistema.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Se aplica a

Seguridad para subprocesos

Una ParallelLoopState instancia está pensada para usarse solo dentro del cuerpo del bucle al que se proporcionó una instancia. No es seguro usar una instancia proporcionada ParallelLoopState después de que finalice el bucle asociado, ni tampoco es seguro entregarla explícitamente a otros subprocesos y hacer que esos subprocesos tengan acceso a él en cualquier momento. Se proporcionará una instancia diferente ParallelLoopState a cada subproceso implicado en un bucle.

Consulte también