ParallelLoopState Klasa

Definicja

Umożliwia iterację pętli równoległych do interakcji z innymi iteracji. Wystąpienie tej klasy jest dostarczane przez klasę Parallel do każdej pętli. Nie można tworzyć wystąpień w kodzie.

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

Przykłady

Poniższy przykład wykonuje równolegle maksymalnie 100 iteracji pętli. Każda iteracja wstrzymuje się dla losowego interwału z zakresu od 1 do 1000 milisekund. Losowo wygenerowana wartość określa, na której iteracji pętli Break wywoływana jest metoda. Jak pokazuje dane wyjściowe z przykładu, nie ma iteracji, których indeks jest większy niż LowestBreakIteration wartość właściwości rozpoczyna się po wywołaniu Break metody.

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

Ponieważ iteracji pętli nadal mogą być wykonywane podczas Break wywoływanej metody, każda iteracja wywołuje ShouldExitCurrentIteration właściwość w celu sprawdzenia, czy inna iteracji nazwała metodę Break . Jeśli wartość właściwości to true, iteracja sprawdza wartość LowestBreakIteration właściwości i, jeśli jest większa niż wartość indeksu bieżącej iteracji, zwraca natychmiast.

Uwagi

Pamiętaj, że nie można utworzyć wystąpienia tej klasy. Jest on generowany automatycznie przez kompilator jako argument w wywołaniu metody Parallel.For lub Parallel.ForEach . Przykład stanowi ilustrację.

Konstrukcje, takie jak for i (w języku C#) i foreach For For Each (w Visual Basic) są wykonywane sekwencyjnie z najniższego indeksu do najwyższego lub od pierwszego obiektu w zestawie do ostatniego. Parallel.For Natomiast metody i Parallel.ForEach nie. Ponieważ poszczególne iteracji pętli są uruchamiane równolegle, mogą one rozpoczynać się i kończyć w dowolnej kolejności. Klasa ParallelLoopState umożliwia poszczególnym iteracji pętli równoległych do interakcji ze sobą. Klasa ParallelLoopState umożliwia:

  • Zakończ bieżącą iterację i uniemożliwij rozpoczęcie wszelkich dodatkowych iteracji przez wywołanie Stop metody . Nie ma to wpływu na iteracji, które już rozpoczęły wykonywanie.

  • Zapobiegaj wykonaniu iteracji za pomocą indeksu większego niż bieżący indeks przez wywołanie Break metody . Nie ma to wpływu na iteracji, które już rozpoczęły wykonywanie.

  • Ustal, czy wystąpił wyjątek w dowolnej iteracji pętli, pobierając wartość IsExceptional właściwości.

  • Ustal, czy jakakolwiek iteracja pętli wywołała metodę Stop , pobierając wartość IsStopped właściwości. Tej właściwości można użyć do powrotu z iteracji pętli, która została uruchomiona przed wywołaniem Stop metody, ale nadal wykonuje.

  • Ustal, czy każda iteracja pętli nazwała metodę Break lub Stop zgłosiła wyjątek, pobierając wartość ShouldExitCurrentIteration właściwości.

  • Wyjdź z długotrwałej iteracji, której indeks jest większy niż indeks iteracji, w której wywołano podział przez pobranie wartości LowestBreakIteration właściwości.

Właściwości

IsExceptional

Pobiera, czy każda iteracja pętli zgłosiła wyjątek, który nie został obsłużony przez iterację.

IsStopped

Pobiera, czy każda iteracja pętli nazwała metodę Stop() .

LowestBreakIteration

Pobiera najniższą iterację pętli, z której Break() została wywołana.

ShouldExitCurrentIteration

Pobiera, czy bieżąca iteracja pętli powinna zakończyć się na podstawie żądań wykonanych przez tę lub inną iterację.

Metody

Break()

Informuje, że pętla Parallel powinna zaprzestać wykonywania iteracji poza bieżącą iterację najwcześniejszą wygodą systemu.

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
Stop()

Informuje, że pętla Parallel powinna przestać wykonywać najwcześniejszą wygodę systemu.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Dotyczy

Bezpieczeństwo wątkowe

Wystąpienie ParallelLoopState ma być używane tylko w treści pętli, do której podano wystąpienie. Nie można bezpiecznie używać podanego ParallelLoopState wystąpienia po zakończeniu skojarzonej pętli ani nie jest bezpieczne jawnie przekazać go do innych wątków i mieć dostęp do nich w dowolnym momencie. Do każdego wątku zaangażowanego w pętlę zostanie udostępnione inne ParallelLoopState wystąpienie.

Zobacz też