ParallelLoopState Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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 .