В частности, я рассматриваю использование TPL для запуска (и ожидания) внешних процессов. Рассматривает ли TPL общую нагрузку на машину (как CPU, так и I/O), прежде чем принимать решение о начале другой задачи (следовательно, в моем случае - другой внешний процесс)?
Например:
У меня есть около 100 медиафайлов, которые нужно закодировать или перекодировать (например, от WAV до FLAC или от FLAC до MP3). Кодирование выполняется путем запуска внешнего процесса (например, FLAC.EXE или LAME.EXE). Каждый файл занимает около 30 секунд. Каждый процесс в основном связан с процессором, но там есть некоторые входы/выходы. У меня есть 4 ядра, поэтому самый худший случай (перекодирование путем подачи декодера в кодировщик) по-прежнему использует только 2 ядра. Я хотел бы сделать что-то вроде:
Parallel.ForEach(sourceFiles,
sourceFile =>
TranscodeUsingPipedExternalProcesses(sourceFile));
Отпустит ли это 100 задач (и, следовательно, 200 внешних процессов, конкурирующих за процессор)? Или он увидит, что CPU занят и выполняет только 2-3 за раз?