ParallelLoopState Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Umožňuje interakci iterací paralelních smyček s jinými iteracemi. Instance této třídy je poskytována Parallel třídou do smyčky each; v kódu nelze vytvořit instance.
public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
- Dědičnost
-
ParallelLoopState
Příklady
Následující příklad spustí paralelně až 100 iterací smyčky. Každá iterace se pozastaví na náhodný interval od 1 do 1 000 milisekund. Náhodně generovaná hodnota určuje, při které iteraci smyčky Break je metoda volána. Jak ukazuje výstup z příkladu, po volání Break metody nespustí žádné iterace, jejichž index je větší než LowestBreakIteration hodnota vlastnosti.
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
Vzhledem k tomu, že iterace smyčky jsou stále pravděpodobně spuštěny při Break volání metody, každá iterace volá ShouldExitCurrentIteration vlastnost ke kontrole, zda další iterace volala metodu Break . Pokud je true
hodnota vlastnosti , iterace zkontroluje hodnotu LowestBreakIteration vlastnosti, a pokud je větší než hodnota indexu aktuální iterace, vrátí okamžitě.
Poznámky
Všimněte si, že instanci této třídy nelze vytvořit. Je automaticky generován kompilátorem jako argument ve volání Parallel.For metody nebo Parallel.ForEach . Příklad uvádí ukázku.
Konstrukce jako for
a foreach
(v jazyce C#) a For
a For Each
(v jazyce Visual Basic) se provádějí postupně od nejnižšího indexu k nejvyššímu nebo od prvního objektu v sadě po poslední. Naproti tomu Parallel.For metody a Parallel.ForEach nikoli. Vzhledem k tomu, že jednotlivé iterace smyčky běží paralelně, mohou začínat a končit v libovolném pořadí. Třída ParallelLoopState umožňuje interakci jednotlivých iterací paralelních smyček. Třída ParallelLoopState umožňuje:
Ukončete aktuální iteraci a zabráníte spuštění dalších iterací voláním Stop metody . To nemá vliv na iterace, které již byly zahájeny.
Zabrání spuštění iterací s indexem větším než aktuální index voláním Break metody . To nemá vliv na iterace, které již byly zahájeny.
Zjistěte, zda došlo k výjimce v iteraci smyčky načtením hodnoty IsExceptional vlastnosti.
Zjistěte, zda některá iterace smyčky volala metodu Stop načtením hodnoty IsStopped vlastnosti . Tuto vlastnost můžete použít k návratu z iterací smyčky, které byly spuštěny před voláním Stop metody, ale jsou stále spuštěny.
Zjistěte, zda některá iterace smyčky volala metodu Break nebo Stop nebo vyvolala výjimku načtením hodnoty ShouldExitCurrentIteration vlastnosti .
Ukončete dlouhotrvající iteraci, jejíž index je větší než index iterace, ve které byl volána přerušení načtením hodnoty LowestBreakIteration vlastnosti .
Vlastnosti
IsExceptional |
Získá, zda jakákoli iterace smyčky vyvolala výjimku, která byla neošetřená iterací. |
IsStopped |
Získá, zda jakákoli iterace smyčky volala metodu Stop() . |
LowestBreakIteration |
Získá nejnižší iteraci smyčky, ze které Break() byla volána. |
ShouldExitCurrentIteration |
Získá, zda aktuální iterace smyčky by měla být ukončena na základě požadavků provedených touto nebo jinými iteracemi. |
Metody
Break() |
Oznamuje, že smyčka Parallel by měla co nejdříve zastavit provádění iterací nad rámec aktuální iterace systému. |
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetHashCode() |
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetType() |
Type Získá z aktuální instance. (Zděděno od Object) |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
Stop() |
Informuje o tom, že smyčka Parallel by měla přestat spouštět při nejbližším pohodlí systému. |
ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |
Platí pro
Bezpečný přístup z více vláken
Instance ParallelLoopState je určena k použití pouze v rámci těla smyčky, do které byla instance poskytnuta. Není bezpečné použít poskytnutou ParallelLoopState instanci po ukončení přidružené smyčky, ani není bezpečné ji explicitně předat jiným vláknům a mít k ní přístup tato vlákna kdykoli. Každé vlákno zapojené do smyčky poskytne jinou ParallelLoopState instanci.