Sdílet prostřednictvím


Postupy: Zápis Parallel.ForEach smyčky, který byl podproces místní proměnné

Následující příklad ukazuje, jak psát ForEach Metoda, která používá podproces místní proměnné. Když ForEach spustí smyčku, rozdělí jeho zdrojové kolekce do více oddílů. Každý oddíl obdrží vlastní kopii "podproces místní" Proměnná. (Termín "místní podproces" je poněkud nepřesné, protože v některých případech může spustit dva oddíly ve stejném podprocesu.)

Parametry v tomto příkladu kódu a výtvarnou odpovídající For metody. Další informace naleznete v tématu Postupy: Zápis Parallel.For smyčky, který byl podproces místní proměnné.

Příklad

Použití podproces místní proměnné v ForEach smyčky, musíte použít verzi metody, která trvá dva type Parametry. První parametr určuje typ prvku zdroj a druhý parametr určuje typ podprocesu místní proměnné.

První vstupní parametr je zdroj dat a druhá je funkce, která bude podproces místní proměnnou inicializovat. Třetí vstupní parametr Func<T1, T2, T3, TResult> je vyvolán paralelní opakovat na každé iteraci. Zadat kód pro delegáta a předá smyčky v vstupní parametry. Vstupní parametry jsou aktuální prvek ParallelLoopState proměnné, která umožňuje zkoumat stav smyčky a podproces místní proměnné. Vrátí metoda podproces místní proměnné a pak předává následující iteraci v tomto oddílu. Tato proměnná se liší ve všech oddílech smyčky.

Poslední vstupní parametr ForEach Metoda je Action<T> delegát, který bude po dokončení všech smyčky vyvolání metody. Metoda dodává konečná hodnota podproces místní proměnné pro toto vlákno (nebo smyčky oddílu) a zadat kód, který zachycuje konečné hodnoty a provede opatření je nutné kombinovat s výsledky z jiných oddílů výsledek z tohoto oddílu. Protože je typ delegáta Action<T>, neexistují žádné vrácené hodnoty.

' How to: Write a Parallel.ForEach Loop That Has Thread-Local Variables

Imports System.Threading
Imports System.Threading.Tasks

Module ForEachThreadLocal
    Sub Main()

        Dim nums() As Integer = Enumerable.Range(0, 1000000).ToArray()
        Dim total As Long = 0

        ' First type paramemter is the type of the source elements
        ' Second type parameter is the type of the local data (subtotal)
        Parallel.ForEach(Of Integer, Long)(nums, Function() 0,
                                           Function(elem, loopState, subtotal)
                                               subtotal += nums(elem)
                                               Return subtotal
                                           End Function,
                                            Sub(finalResult)
                                                Interlocked.Add(total, finalResult)
                                            End Sub)

        Console.WriteLine("The result of Parallel.ForEach is {0}", total)
        Console.WriteLine("Press any key to exit.")
        Console.ReadKey()
    End Sub
End Module
namespace ThreadLocalForEach
{
    using System;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;


    class Test
    {

        static void Main()
        {
            int[] nums = Enumerable.Range(0, 1000000).ToArray();
            long total = 0;

            // First type parameter is the type of the source elements
            // Second type parameter is the type of the local data (subtotal)
            Parallel.ForEach<int, long>(nums, // source collection
                                        () => 0, // method to initialize the local variable
                                        (j, loop, subtotal) => // method invoked by the loop on each iteration
                                        {
                                            subtotal += nums[j]; //modify local variable
                                            return subtotal; // value to be passed to next iteration
                                        },
                // Method to be executed when all loops have completed.
                // finalResult is the final value of subtotal. supplied by the ForEach method.
                                        (finalResult) => Interlocked.Add(ref total, finalResult)
                                        );

            Console.WriteLine("The total from Parallel.ForEach is {0}", total);
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }
    }
}

Viz také

Úkoly

Postupy: Zápis Parallel.For smyčky, který byl podproces místní proměnné

Koncepty

Datový paralelismus (Task Parallel Library)

Lambda výrazy v PLINQ a TPL