ParallelLoopState Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee kunnen iteraties van parallelle lussen communiceren met andere iteraties. Een exemplaar van deze klasse wordt door de Parallel klasse aan elke lus verstrekt. U kunt geen exemplaren maken in uw code.
public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
- Overname
-
ParallelLoopState
Voorbeelden
In het volgende voorbeeld worden maximaal 100 iteraties van een lus parallel uitgevoerd. Elke iteratie pauzeert voor een willekeurig interval van 1 tot 1.000 milliseconden. Een willekeurig gegenereerde waarde bepaalt welke iteratie van de lus de Break methode wordt aangeroepen. Zoals de uitvoer uit het voorbeeld laat zien, worden er geen iteraties weergegeven waarvan de index groter is dan de LowestBreakIteration eigenschapswaarde na de aanroep naar de Break methode.
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
Omdat iteraties van de lus waarschijnlijk nog steeds worden uitgevoerd wanneer de Break methode wordt aangeroepen, roept elke iteratie de ShouldExitCurrentIteration eigenschap aan om te controleren of een andere iteratie de Break methode heeft aangeroepen. Als de eigenschapswaarde is true, controleert de iteratie de waarde van de LowestBreakIteration eigenschap en wordt, als deze groter is dan de indexwaarde van de huidige iteratie, onmiddellijk geretourneerd.
Opmerkingen
Houd er rekening mee dat u geen instantie van deze klasse kunt instantiëren. Het wordt automatisch gegenereerd door de compiler als een argument in een aanroep naar de Parallel.For of Parallel.ForEach methode. In het voorbeeld ziet u een afbeelding.
Constructies zoals for en foreach (in C#) en For en For Each (in Visual Basic) worden opeenvolgend uitgevoerd van de laagste index naar het hoogste of van het eerste object in een set op de laatste. De en Parallel.ForEach methoden daarentegen Parallel.For niet. Omdat afzonderlijke iteraties van de lus parallel worden uitgevoerd, kunnen ze in elke volgorde beginnen en eindigen. Met de ParallelLoopState klasse kunnen afzonderlijke iteraties van parallelle lussen met elkaar communiceren. Met de ParallelLoopState klasse kunt u het volgende doen:
Sluit de huidige iteratie af en voorkom dat er extra iteraties worden gestart door de methode aan te Stop roepen. Dit heeft geen invloed op iteraties die al zijn gestart met de uitvoering.
Voorkom dat iteraties met een index groter zijn dan de huidige index, door de Break methode aan te roepen. Dit heeft geen invloed op iteraties die al zijn gestart met de uitvoering.
Bepaal of er een uitzondering is opgetreden in een lus-iteratie door de waarde van de IsExceptional eigenschap op te halen.
Bepaal of een iteratie van de lus de Stop methode heeft aangeroepen door de waarde van de IsStopped eigenschap op te halen. U kunt deze eigenschap gebruiken om terug te keren van iteraties van de lus die is gestart vóór de aanroep naar de Stop methode, maar nog steeds wordt uitgevoerd.
Bepaal of een iteratie van de lus de Break of Stop methode heeft aangeroepen of een uitzondering heeft gegenereerd door de waarde van de ShouldExitCurrentIteration eigenschap op te halen.
Sluit af van een langlopende iteratie waarvan de index groter is dan de index van een iteratie waarin Onderbreking is aangeroepen door de waarde van de LowestBreakIteration eigenschap op te halen.
Eigenschappen
| Name | Description |
|---|---|
| IsExceptional |
Hiermee wordt aangegeven of een iteratie van de lus een uitzondering heeft gegenereerd die niet is verwerkt door die iteratie. |
| IsStopped |
Hiermee wordt aangegeven of een iteratie van de lus de Stop() methode heeft aangeroepen. |
| LowestBreakIteration |
Hiermee haalt u de laagste iteratie van de lus op waaruit Break() is aangeroepen. |
| ShouldExitCurrentIteration |
Hiermee wordt aangegeven of de huidige iteratie van de lus moet worden afgesloten op basis van aanvragen die door deze of andere iteraties zijn gedaan. |
Methoden
| Name | Description |
|---|---|
| Break() |
Communiceert dat de lus de Parallel uitvoering van iteraties buiten de huidige iteratie moet beëindigen op het vroegste gemak van het systeem. |
| Equals(Object) |
Bepaalt of het opgegeven object gelijk is aan het huidige object. (Overgenomen van Object) |
| GetHashCode() |
Fungeert als de standaardhashfunctie. (Overgenomen van Object) |
| GetType() |
Hiermee haalt u de Type huidige instantie op. (Overgenomen van Object) |
| MemberwiseClone() |
Hiermee maakt u een ondiepe kopie van de huidige Object. (Overgenomen van Object) |
| Stop() |
Communiceert dat de Parallel lus de uitvoering van het eerste gemak van het systeem moet beëindigen. |
| ToString() |
Retourneert een tekenreeks die het huidige object vertegenwoordigt. (Overgenomen van Object) |
Van toepassing op
Veiligheid thread
Een ParallelLoopState exemplaar is bedoeld om alleen binnen de hoofdtekst van de lus te worden gebruikt waarnaar een exemplaar is opgegeven. Het is niet veilig om een gegeven ParallelLoopState exemplaar te gebruiken nadat de bijbehorende lus is beëindigd, en het is ook niet veilig om deze expliciet aan andere threads af te geven en deze threads op elk gewenst moment te openen. Er wordt een ander ParallelLoopState exemplaar verstrekt aan elke thread die betrokken is bij een lus.