Ответ 1
Ответ заключается в том, что это верхний предел для всей параллельной операции, независимо от количества ядер.
Таким образом, даже если вы не используете CPU, потому что вы ожидаете ввода-вывода или блокировки, никакие дополнительные задачи не будут выполняться параллельно, а только максимум, который вы укажете.
Чтобы узнать это, я написал этот фрагмент тестового кода. Существует искусственный замок, чтобы стимулировать TPL использовать больше потоков. То же самое произойдет, когда ваш код ожидает ввода-вывода или базы данных.
class Program
{
static void Main(string[] args)
{
var locker = new Object();
int count = 0;
Parallel.For
(0
, 1000
, new ParallelOptions { MaxDegreeOfParallelism = 2 }
, (i) =>
{
Interlocked.Increment(ref count);
lock (locker)
{
Console.WriteLine("Number of active threads:" + count);
Thread.Sleep(10);
}
Interlocked.Decrement(ref count);
}
);
}
}
Если я не укажу MaxDegreeOfParallelism, ведение журнала консоли показывает, что одновременно работает около 8 задач. Вот так:
Number of active threads:6
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:6
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Он начинает снижаться, увеличивается с течением времени, и в конце он пытается запустить 8 одновременно.
Если я ограничу его каким-либо произвольным значением (скажем, 2), я получаю
Number of active threads:2
Number of active threads:1
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
О, и это на четырехъядерной машине.