Parallel.ForEach и PLINQ
Выполняйте работу параллельно с Parallel.ForEach и создавайте параллельные конвейеры с PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).
«Parallel.ForEach и PLINQ» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.
Зачем нужны параллельные циклы
Цель: эффективнее использовать CPU.
- Parallel.ForEach: действие для каждого элемента
- PLINQ: параллельный запрос с операторами
- Управлять степенью параллелизма
- Осторожно работать с побочными эффектами
Основы Parallel.ForEach
Parallel.ForEach распределяет итерации между потоками; для каждого элемента выполняется указанное действие.
using System;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
// Runs iterations concurrently on thread pool
Parallel.ForEach(data, x =>
{
int y = x * x; // small CPU work
Console.WriteLine("x=" + x + " y=" + y + " on " + Environment.CurrentManagedThreadId);
});
}
}
Управление параллелизмом
Используйте ParallelOptions.MaxDegreeOfParallelism, чтобы ограничить степень параллелизма при нехватке ресурсов.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
ParallelOptions opt = new ParallelOptions();
opt.MaxDegreeOfParallelism = 2; // limit concurrency
Parallel.ForEach(data, opt, x =>
{
Console.WriteLine("Start " + x);
Thread.Sleep(150); // simulate work
Console.WriteLine("Done " + x);
});
}
}
Конвейер PLINQ
PLINQ выполняет операторы LINQ параллельно. ForAll одновременно обрабатывает результаты без сохранения порядка.
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] nums = Enumerable.Range(1, 20).ToArray();
// Filter then project in parallel
var query =
nums
.AsParallel()
.WithDegreeOfParallelism(2)
.Where(n => n % 2 == 0)
.Select(n => n * n);
// ForAll consumes in parallel; order not guaranteed
query.ForAll(sq => Console.WriteLine(sq));
}
}
Управление порядком
Используйте AsOrdered, чтобы сохранить порядок; при необходимости AsSequential возвращает LINQ к однопоточному выполнению.
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] nums = new int[] { 5, 4, 3, 2, 1 };
// Preserve original sequence order for the output
var ordered =
nums.AsParallel().AsOrdered().Select(n => n * 10).ToArray();
// Switch back to sequential for a section if needed
var seq =
nums.AsParallel().Select(n => n + 1).AsSequential().Where(n => n > 3).ToArray();
Console.WriteLine("Ordered: " + string.Join(",", ordered));
Console.WriteLine("Sequential tail: " + string.Join(",", seq));
}
}
Безопасность и советы
Советы:
- Избегайте общего изменяемого состояния; предпочитайте чистые функции.
- Если необходимо записывать данные, используйте потокобезопасные коллекции.
- Обрабатывайте более крупные пакеты вместо множества мелких элементов работы.
- Измеряйте результаты: параллелизм помогает при работе с высокой нагрузкой на CPU, но не при ожидании ввода-вывода.
Parallel.ForEach и PLINQ
Итоги
Итоги: используйте Parallel.ForEach для действий над отдельными элементами; используйте PLINQ для построения параллельных запросов, управления параллелизмом и, при необходимости, сохранения порядка.
Часто задаваемые вопросы
Урок «Parallel.ForEach и PLINQ» бесплатный?
Да — полный текст урока «Parallel.ForEach и PLINQ» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.
Чему я научусь в уроке «Parallel.ForEach и PLINQ»?
Выполняйте работу параллельно с Parallel.ForEach и создавайте параллельные конвейеры с PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered). Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.
Сколько времени занимает урок «Parallel.ForEach и PLINQ»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Parallel.ForEach и PLINQ
- Производитель и потребитель с каналами (обзор)
- Компромиссы между пропускной способностью и задержкой