Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo Parallel.ForEach<TSource>(Partitioner<TSource>, Action<TSource>)

.NET Framework (current version)
 

Data di pubblicazione: ottobre 2016

Esegue un'operazione foreach (For Each in Visual Basic) su un oggetto Partitioner in cui le iterazioni possono essere eseguite in parallelo.

Spazio dei nomi:   System.Threading.Tasks
Assembly:  mscorlib (in mscorlib.dll)

public static ParallelLoopResult ForEach<TSource>(
	Partitioner<TSource> source,
	Action<TSource> body
)

Parametri

source
Type: System.Collections.Concurrent.Partitioner<TSource>

Oggetto Partitioner contenente l'origine dati originale.

body
Type: System.Action<TSource>

Delegato richiamato una volta per iterazione.

Valore restituito

Type: System.Threading.Tasks.ParallelLoopResult

Struttura che contiene informazioni sulla parte di ciclo completata.

Parametri tipo

TSource

Tipo degli elementi nell'oggetto source.

Exception Condition
ArgumentNullException

Il source è null.

-oppure-

Il valore dell'argomento body è null.

InvalidOperationException

Il SupportsDynamicPartitions proprietà di source partitioner restituisce false.

-oppure-

L'eccezione generata quando in metodi di source partitioner restituito null.

-oppure-

Il GetPartitions metodo il source partitioner non restituisce il numero corretto di partizioni.

Questo overload viene fornito per scenari in cui si desidera sostituire il valore predefinito di schema di partizionamento. Ad esempio, corpi di ciclo di piccole dimensioni possono trarre vantaggio dal partizionamento per intervallo. Il Parallel.ForEach<TSource> metodo prevede un partitioner personalizzati per supportare il partizionamento dinamico. Per ulteriori informazioni, vedere partitioner personalizzati per PLINQ e TPL e procedura: implementare partizioni dinamiche.

Nell'esempio seguente viene illustrato come implementare un partitioner intervallo per l'utilizzo con Parallel.ForEach<TSource>:

using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

class RangePartitionerDemo 
{
        static void Main()
        {
            Stopwatch sw = null;

            long sum = 0;
            long SUMTOP = 10000000;

            // Try sequential for
            sw = Stopwatch.StartNew();
            for (long i = 0; i < SUMTOP; i++) sum += i;
            sw.Stop();
            Console.WriteLine("sequential for result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);

            // Try parallel for -- this is slow!
            //sum = 0;
            //sw = Stopwatch.StartNew();
            //Parallel.For(0L, SUMTOP, (item) => Interlocked.Add(ref sum, item));
            //sw.Stop();
            //Console.WriteLine("parallel for  result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);

            // Try parallel for with locals
            sum = 0;
            sw = Stopwatch.StartNew();
            Parallel.For(0L, SUMTOP, () => 0L, (item, state, prevLocal) => prevLocal + item, local => Interlocked.Add(ref sum, local));
            sw.Stop();
            Console.WriteLine("parallel for w/locals result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);

            // Try range partitioner
            sum = 0;
            sw = Stopwatch.StartNew();
            Parallel.ForEach(Partitioner.Create(0L, SUMTOP), (range) =>
            {
                long local = 0;
                for (long i = range.Item1; i < range.Item2; i++) local += i;
                Interlocked.Add(ref sum, local);
            });
            sw.Stop();
            Console.WriteLine("range partitioner result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);
        }
}

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 4.0
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: