среда, 24 августа 2011 г.

Parallel Programming - параллельная обработка элементов коллекции

Задача: вам нужно параллельно обработать каждый элемент коллекции

Решение: используйте метод System.Threading.Parallel.ForEach для создания новой задачи для каждого элемента коллекции. Опционально можете использовать тип System.Threading.ParallelOptions для ограничения степени параллелизма при выполнении задач над элементами коллекции.

Как это работает
Статический метод Parallel.ForEach в качестве аргументов принимает коллекцию, делегат и необязательный аргумент типа ParallelOptions. Новая задача создается для выполнения задачи над каждым элементом коллекции, используя переданный делегат. Количество конкурентных задач управляется с помощью свойства ParallelOptions.MaxDegreeOfParallelism: значение -1 означает, что степень параллелизима будет определена средой выполнения, значение 1 или больше - количество задач, которые будут выполняться одновременно (значение 0 приведет к выдаче исключения).

Пример кода:
        private void PrintNumbers(int baseNumber)
        {
            for (int i = baseNumber, j = baseNumber + 10; i < j; i++)
            {
                Console.WriteLine("Число: {0}", i);
                Thread.Sleep(100);
            }
        }

        public void StartTest()
        {
            // Определяем данные, которые необходимо обработать
            int[] numbersArray = { 100, 200, 300 };

            // Конфигурируем опции
            ParallelOptions options = new ParallelOptions();
            options.MaxDegreeOfParallelism = 2;

            // Обрабатываем каждый элемент данных параллельно
            Parallel.ForEach(
                numbersArray,
                options,
                baseNumber => PrintNumbers(baseNumber)
            );
        }

Источник: "C# 2010 Recipes - A Problem Solution Approach" Allen Jones and Adam Freeman.

Предыдущая статья: "Parallel Programming - ожидания завершения задач"

Комментариев нет:

Отправить комментарий