0Pricing
C# Academy · Урок

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» бесплатный?

Да — полный текст урока «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 — локальная установка не требуется.

Все уроки этого курса

  1. Parallel.ForEach и PLINQ
  2. Производитель и потребитель с каналами (обзор)
  3. Компромиссы между пропускной способностью и задержкой
← Назад к C# Academy