См. Библиотека параллельных задач и асинхронные рабочие процессы .
Я бы суммировал основы следующим образом:
Task Parallel Library : позволяет нескольким единицам работы эффективно работать на нескольких ядрах, включая относительно простые сценарии, такие как порождение нескольких потоков для параллельных вычислений, а также более сложные операции, где сами вычисления также заканчивают тем, что порождали дополнительные задачи. Использует улучшенный пул потоков .NET 4.0 и рабочие очереди кражи, чтобы гарантировать, что все ядра заняты.
Асинхронные рабочие процессы : позволяет выполнять асинхронные вычисления, не занимая ненужных потоков, и инициировать обратные вызовы, когда результаты доступны.
PLINQ : код, написанный с использованием PLINQ, в конечном итоге выполняется через TPL, но это более приятный интерфейс для кода, который легко выражается с помощью запросов LINQ (например, выполнение одной операции над каждым элементом в массиве данные параллельно).
Обратите внимание, что асинхронные рабочие процессы могут быть преобразованы в задачи с использованием метода StartAsTask
, а задачи могут быть преобразованы в Async
с использованием метода Async.AwaitTask
, поэтому можно объединить технологии, хотя они нацелены на различные целевые сценарии.
Для меня эмпирическое правило заключается в том, что если вы активно выполняете много вычислений в разных потоках, вы захотите использовать TPL (возможно, через PLINQ или эквивалент F #, такой как модуль PSeq), тогда как если вы пытаетесь выполнить много операций ввода-вывода (параллельных или нет), вам следует использовать асинхронные рабочие процессы.
Таким образом, raytracer будет использовать TPL для запуска задач для параллельного рендеринга каждого пикселя (или линии сканирования), максимизируя доступную вычислительную мощность на вашем компьютере.
Но загрузка множества веб-страниц будет выполняться с помощью асинхронных рабочих процессов, так как не нужно много вычислений для распределения по ядрам; Вам просто нужно уведомить ОС, когда результаты появятся.