ParallelLoopState Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Permite que iterações de laços paralelos interajam com outras iterações. Uma instância desta classe é fornecida pela Parallel classe a cada ciclo; não podes criar instâncias no teu código.
public ref class ParallelLoopState
public class ParallelLoopState
type ParallelLoopState = class
Public Class ParallelLoopState
- Herança
-
ParallelLoopState
Exemplos
O exemplo seguinte executa até 100 iterações de um ciclo em paralelo. Cada iteração faz uma pausa aleatória de 1 a 1.000 milissegundos. Um valor gerado aleatoriamente determina em que iteração do ciclo o Break método é chamado. Como mostra o resultado do exemplo, nenhuma iteração cujo índice é maior que o LowestBreakIteration valor da propriedade começa após a chamada ao 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 é provável que as iterações do ciclo ainda estejam a ser 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 verifica o valor da LowestBreakIteration propriedade e, se for maior do que o valor índice da iteração atual, retorna imediatamente.
Observações
Note que não pode instanciar uma instância desta classe. É gerado automaticamente pelo compilador como um argumento numa chamada ao Parallel.For método ou.Parallel.ForEach O exemplo fornece uma ilustração.
Construções como for e foreach (em C#) e For e For Each (em Visual Basic) executam-se sequencialmente do índice mais baixo para o mais alto ou do primeiro objeto de um conjunto para o último. Em contraste, os Parallel.For métodos e Parallel.ForEach não. Como as iterações individuais do ciclo correm em paralelo, podem começar e terminar em qualquer ordem. A ParallelLoopState classe permite que iterações individuais de loops paralelos interajam entre si. A ParallelLoopState aula permite-te:
Saia da iteração atual e evite que quaisquer iterações adicionais comecem chamando o Stop método. Isto não afeta iterações que já começaram a ser executadas.
Evitar que quaisquer iterações com índice superior ao índice atual sejam executadas chamando o Break método. Isto não afeta iterações que já começaram a ser executadas.
Determine se ocorreu uma exceção em qualquer iteração do ciclo, recuperando o valor da IsExceptional propriedade.
Determinar se alguma iteração do ciclo chamou o Stop método recuperando o valor da IsStopped propriedade. Podes usar esta propriedade para retornar iterações do ciclo que começaram antes da chamada ao Stop método mas que ainda estão a executar.
Determinar se alguma iteração do ciclo chamou o Break método ou Stop se lançou uma exceção ao recuperar o valor da ShouldExitCurrentIteration propriedade.
Sair de uma iteração de longa duração cujo índice é maior do que o índice de uma iteração em que Break foi chamado, recuperando o valor da LowestBreakIteration propriedade.
Propriedades
| Name | Description |
|---|---|
| IsExceptional |
Obtém se alguma iteração do ciclo lançou uma exceção que não foi tratada por essa iteração. |
| IsStopped |
Obtém se alguma iteração do ciclo chamou o Stop() método. |
| LowestBreakIteration |
Obtém a iteração mais baixa do ciclo de onde Break() foi chamado. |
| ShouldExitCurrentIteration |
Percebe se a iteração atual do ciclo deve sair com base nos pedidos feitos por esta ou outras iterações. |
Métodos
| Name | Description |
|---|---|
| Break() |
Comunica que o Parallel ciclo deve cessar a execução de iterações para além da iteração atual assim que o sistema o for mais conveniente. |
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| GetHashCode() |
Serve como função de hash predefinida. (Herdado de Object) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| Stop() |
Comunica que o Parallel ciclo deve cessar a execução assim que o sistema for conveniente. |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |
Aplica-se a
Segurança de Thread
Uma ParallelLoopState instância destina-se a ser usada apenas dentro do corpo do loop ao qual uma instância foi fornecida. Não é seguro usar uma instância fornecida ParallelLoopState após o fim do loop associado, nem é seguro passá-la explicitamente para outros threads e que esses threads acedam a ela a qualquer momento. Uma instância diferente ParallelLoopState será fornecida a cada thread envolvido num ciclo.