Condividi tramite


ParallelLoopState Classe

Definizione

Consente alle iterazioni di cicli paralleli di interagire con altre iterazioni. Un'istanza di questa classe viene fornita dalla Parallel classe a ogni ciclo. Non è possibile creare istanze nel codice.

public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
Ereditarietà
ParallelLoopState

Esempio

L'esempio seguente esegue fino a 100 iterazioni di un ciclo in parallelo. Ogni iterazione viene sospesa per un intervallo casuale compreso tra 1 e 1.000 millisecondi. Un valore generato in modo casuale determina in quale iterazione del ciclo viene chiamato il Break metodo . Come illustrato nell'output dell'esempio, nessuna iterazione il cui indice è maggiore del valore della LowestBreakIteration proprietà inizia dopo la chiamata al Break metodo .

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

Poiché le iterazioni del ciclo sono ancora in esecuzione quando viene chiamato il Break metodo , ogni iterazione chiama la ShouldExitCurrentIteration proprietà per verificare se un'altra iterazione ha chiamato il Break metodo . Se il valore della proprietà è true, l'iterazione controlla il valore della LowestBreakIteration proprietà e, se è maggiore del valore di indice dell'iterazione corrente, restituisce immediatamente.

Commenti

Si noti che non è possibile creare un'istanza di questa classe. Viene generato automaticamente dal compilatore come argomento in una chiamata al Parallel.For metodo o Parallel.ForEach . Nell'esempio viene fornita un'illustrazione.

I costrutti come for e foreach (in C#) e For EachFor (in Visual Basic) e (in Visual Basic) sono eseguiti in sequenza dall'indice più basso al massimo o dal primo oggetto in un set all'ultimo. Al contrario, i Parallel.For metodi e Parallel.ForEach non lo sono. Poiché le singole iterazioni del ciclo vengono eseguite in parallelo, possono iniziare e terminare in qualsiasi ordine. La ParallelLoopState classe consente alle singole iterazioni di cicli paralleli di interagire tra loro. La ParallelLoopState classe consente di:

  • Uscire dall'iterazione corrente e impedire l'avvio di altre iterazioni chiamando il Stop metodo . Ciò non influisce sulle iterazioni che hanno già iniziato l'esecuzione.

  • Impedire l'esecuzione di qualsiasi iterazione con un indice maggiore dell'indice corrente chiamando il Break metodo . Ciò non influisce sulle iterazioni che hanno già iniziato l'esecuzione.

  • Determinare se si è verificata un'eccezione in qualsiasi iterazione del ciclo recuperando il valore della IsExceptional proprietà.

  • Determinare se un'iterazione del ciclo ha chiamato il Stop metodo recuperando il valore della IsStopped proprietà . È possibile utilizzare questa proprietà per restituire dalle iterazioni del ciclo avviato prima della Stop chiamata al metodo , ma sono ancora in esecuzione.

  • Determinare se un'iterazione del ciclo ha chiamato il Break metodo o Stop o ha generato un'eccezione recuperando il valore della ShouldExitCurrentIteration proprietà.

  • Uscire da un'iterazione a esecuzione prolungata il cui indice è maggiore dell'indice di un'iterazione in cui è stato chiamato Break recuperando il valore della LowestBreakIteration proprietà.

Proprietà

Nome Descrizione
IsExceptional

Ottiene un valore che indica se un'iterazione del ciclo ha generato un'eccezione non gestita da tale iterazione.

IsStopped

Ottiene un valore che indica se un'iterazione del ciclo ha chiamato il Stop() metodo .

LowestBreakIteration

Ottiene l'iterazione più bassa del ciclo da cui Break() è stato chiamato .

ShouldExitCurrentIteration

Ottiene un valore che indica se l'iterazione corrente del ciclo deve essere chiusa in base alle richieste effettuate da questa o da altre iterazioni.

Metodi

Nome Descrizione
Break()

Comunica che il ciclo deve interrompere l'esecuzione Parallel di iterazioni oltre l'iterazione corrente alla prima comodità del sistema.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetType()

Ottiene il Type dell'istanza corrente.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale del Objectcorrente.

(Ereditato da Object)
Stop()

Comunica che il ciclo deve interrompere l'esecuzione Parallel alla prima comodità del sistema.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Si applica a

Thread safety

Un'istanza ParallelLoopState di deve essere usata solo all'interno del corpo del ciclo a cui è stata fornita un'istanza. Non è sicuro usare un'istanza fornita ParallelLoopState dopo il termine del ciclo associato, né è sicuro di consegnarlo in modo esplicito ad altri thread e di accedervi in qualsiasi momento. A ogni thread coinvolto in un ciclo verrà fornita un'istanza diversa ParallelLoopState .

Vedi anche