ParallelLoopState Osztály

Definíció

Lehetővé teszi a párhuzamos hurkok iterációinak más iterációkkal való interakcióját. Az osztály egy példányát az Parallel osztály minden ciklushoz biztosítja; a kódban nem hozhat létre példányokat.

public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
Öröklődés
ParallelLoopState

Példák

Az alábbi példa egy ciklus legfeljebb 100 iterációját hajtja végre párhuzamosan. Minden iteráció 1 és 1000 ezredmásodperc közötti véletlenszerű időközönként szünetel. A véletlenszerűen generált érték határozza meg, hogy a metódus melyik ciklus iterációját Break hívja meg. Ahogy a példa kimenete is mutatja, a metódus hívása LowestBreakIteration után nem kezdődnek olyan iterációk, amelyek indexe nagyobb a Break tulajdonságértéknél.

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

Mivel a ciklus iterációi továbbra is végrehajtásra kerülnek a Break metódus meghívásakor, minden iteráció meghívja a ShouldExitCurrentIteration tulajdonságot annak ellenőrzésére, hogy egy másik iteráció hívta-e meg a metódust Break . Ha a tulajdonság értéke az true, az iteráció ellenőrzi a LowestBreakIteration tulajdonság értékét, és ha nagyobb, mint az aktuális iteráció indexértéke, azonnal visszaadja.

Megjegyzések

Vegye figyelembe, hogy az osztály egy példányát nem lehet példányosítani. A fordító automatikusan létrehozza argumentumként a hívásban Parallel.For vagy Parallel.ForEach metódusban. A példa egy illusztrációt tartalmaz.

Az olyan szerkezetek, mint a for és foreach (C#-ban) és For és For Each (Visual Basic) sorrendben hajtják végre a legalacsonyabb indextől a legmagasabbig vagy az utolsóig tartó halmaz első objektumától. Ezzel szemben a metódusok és Parallel.For a Parallel.ForEach metódusok nem. Mivel a ciklus egyes iterációi párhuzamosan futnak, bármilyen sorrendben kezdődhetnek és végződhetnek. Az ParallelLoopState osztály lehetővé teszi, hogy a párhuzamos hurkok egyéni iterációi kommunikáljanak egymással. Az ParallelLoopState osztály lehetővé teszi a következőt:

  • Lépjen ki az aktuális iterációból, és a metódus meghívásával megakadályozza a további iterációk indítását Stop . Ez nem érinti azokat az iterációkat, amelyek már megkezdték a végrehajtást.

  • A metódus meghívásával Break megakadályozhatja, hogy az aktuálisnál nagyobb indexet tartalmazó iterációk végrehajthatók. Ez nem érinti azokat az iterációkat, amelyek már megkezdték a végrehajtást.

  • A tulajdonság értékének beolvasásával állapítsa meg, hogy történt-e kivétel a hurok iterációjában IsExceptional .

  • A tulajdonság értékének beolvasásával állapítsa meg, hogy a hurok iterációja meghívta-e Stop a metódust IsStopped . Ezzel a tulajdonságdal visszatérhet a metódus hívása Stop előtt elindított, de továbbra is végrehajtó hurok iterációiból.

  • Állapítsa meg, hogy a hurok bármely iterációja meghívta-e a Break metódust, vagy Stop kivételt okozott-e a ShouldExitCurrentIteration tulajdonság értékének beolvasásával.

  • Lépjen ki egy hosszú ideig futó iterációból, amelynek indexe nagyobb, mint annak az iterációnak az indexe, amelyben a törés a tulajdonság értékének LowestBreakIteration beolvasásával lett meghívva.

Tulajdonságok

Name Description
IsExceptional

Lekérdezi, hogy a hurok bármely iterációja kivételt okozott-e, amely nem lett kezelve az adott iterációval.

IsStopped

Lekérdezi, hogy a ciklus bármely iterációja metódusnak nevezte-e.Stop()

LowestBreakIteration

Lekéri annak a huroknak a legalacsonyabb iterációját, amelyből Break() meghívták.

ShouldExitCurrentIteration

Lekérdezi, hogy a ciklus aktuális iterációjának ki kell-e lépnie az e vagy más iterációk által küldött kérések alapján.

Metódusok

Name Description
Break()

Közli, hogy a Parallel ciklusnak meg kell szüntetnie az iterációk végrehajtását az aktuális iteráción túl, a rendszer legkorábbi kényelme érdekében.

Equals(Object)

Meghatározza, hogy a megadott objektum egyenlő-e az aktuális objektummal.

(Öröklődés forrása Object)
GetHashCode()

Ez az alapértelmezett kivonatoló függvény.

(Öröklődés forrása Object)
GetType()

Lekéri az Type aktuális példányt.

(Öröklődés forrása Object)
MemberwiseClone()

Az aktuális Objectpéldány sekély másolatát hozza létre.

(Öröklődés forrása Object)
Stop()

Közli, hogy a Parallel huroknak a rendszer lehető legkorábbi kényelme szerint be kell szüntetnie a végrehajtást.

ToString()

Az aktuális objektumot jelképező sztringet ad vissza.

(Öröklődés forrása Object)

A következőre érvényes:

Szálbiztonság

A ParallelLoopState példányok csak annak a huroknak a törzsén belül használhatók, amelyhez a példányt biztosították. Nem biztonságos egy adott ParallelLoopState példány használata a társított hurok vége után, és nem biztonságos, hogy explicit módon átadja azt más szálaknak, és hogy ezek a szálak bármikor hozzáférhessenek. A rendszer egy másik ParallelLoopState példányt biztosít a ciklusban részt vevő összes szálnak.

Lásd még