ParallelLoopState Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Permite que iterações de loops paralelos interajam com outras iterações. Uma instância dessa classe é fornecida pela classe Parallel a cada loop. Você não pode criar instâncias no seu código.
public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
- Herança
-
ParallelLoopState
Exemplos
O exemplo a seguir executa até 100 iterações de um loop em paralelo. Cada iteração pausa para um intervalo aleatório de 1 a 1.000 milissegundos. Um valor gerado aleatoriamente determina em qual iteração do loop o Break método é chamado. Como mostra a saída do exemplo, nenhuma iteração cujo índice é maior que o valor da LowestBreakIteration propriedade é iniciado após a chamada para o Break método.
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
Como as iterações do loop ainda são prováveis de serem executadas quando o Break método é chamado, cada iteração chama a ShouldExitCurrentIteration propriedade para verificar se outra iteração chamou o Break método. Se o valor da propriedade for true
, a iteração verificará o valor da LowestBreakIteration propriedade e, se for maior que o valor do índice da iteração atual, retornará imediatamente.
Comentários
Observe que você não pode instanciar uma instância dessa classe. Ele é gerado automaticamente pelo compilador como um argumento em uma chamada ao método ou Parallel.ForEach ao Parallel.For método. O exemplo fornece uma ilustração.
Construções como for
e foreach
(em C#) e For
For Each
(em Visual Basic) são executadas sequencialmente do índice mais baixo para o mais alto ou do primeiro objeto em um conjunto até o último. Por outro lado, os métodos e Parallel.ForEach os Parallel.For métodos não. Como as iterações individuais do loop são executadas em paralelo, elas podem começar e terminar em qualquer ordem. A ParallelLoopState classe permite que iterações individuais de loops paralelos interajam entre si. A ParallelLoopState classe permite que você:
Saia da iteração atual e impeça que iterações adicionais sejam iniciadas chamando o Stop método. Isso não afeta iterações que já iniciaram a execução.
Impedir que as iterações com um índice maior que o índice atual sejam executadas chamando o Break método. Isso não afeta iterações que já iniciaram a execução.
Determine se ocorreu uma exceção em qualquer iteração de loop recuperando o valor da IsExceptional propriedade.
Determine se alguma iteração do loop chamou o Stop método recuperando o valor da IsStopped propriedade. Você pode usar essa propriedade para retornar de iterações do loop que começou antes da chamada para o Stop método, mas ainda está em execução.
Determine se qualquer iteração do loop chamou o Break método ou Stop lançou uma exceção recuperando o valor da ShouldExitCurrentIteration propriedade.
Saia de uma iteração de longa execução cujo índice é maior que o índice de uma iteração na qual Break foi chamado recuperando o valor da LowestBreakIteration propriedade.
Propriedades
IsExceptional |
Obtém se qualquer iteração do loop gerou uma exceção que ficou sem tratamento por aquela iteração. |
IsStopped |
Obtém se qualquer iteração do loop chamou o método Stop(). |
LowestBreakIteration |
Obtém a menor iteração do loop do qual Break() foi chamado. |
ShouldExitCurrentIteration |
Obtém se a iteração atual do loop deve sair com base nas solicitações feitas por esta ou outras iterações. |
Métodos
Break() |
Comunica que o loop de Parallel deve encerrar a execução de iterações além da iteração atual, conforme a necessidade mais recente do sistema. |
Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
GetHashCode() |
Serve como a função de hash padrão. (Herdado de Object) |
GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
MemberwiseClone() |
Cria uma cópia superficial do Object atual. (Herdado de Object) |
Stop() |
Comunica que o loop Parallel deve cessar a execução assim que for possível para o sistema. |
ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
Aplica-se a
Acesso thread-safe
Uma ParallelLoopState instância deve ser usada somente dentro do corpo do loop ao qual uma instância foi fornecida. Não é seguro usar uma instância fornecida ParallelLoopState após o término do loop associado, nem é seguro entregá-la explicitamente para outros threads e fazer com que esses threads a acessem a qualquer momento. Uma instância diferente ParallelLoopState será fornecida para cada thread envolvido em um loop.