Task.Factory.StartNew не запускает задачу, она добавляет задачу в список задач, которые должны быть запланированы, и планировщик принимает решение, когда запускать задачу, основываясь на таких вещах, как; количество доступных ядер (размер пула потоков), текущая загрузка процессора и пропускная способность существующей работы.
Вы должны прочитать раздел о планировании задач здесь:
http://parallelpatterns.codeplex.com/releases/view/48562
Страница 63 из PDF.
Параметр LongRunning «исправляет» вашу проблему, полностью обходя пул потоков. Это имеет некоторые недостатки в том, что позволит вам создавать больше потоков, чем ваша система должна реально использовать, это снизит производительность, вызывая чрезмерное переключение контекста.
Эксперименты, подобные приведенному выше коду с использованием режима сна, вводят в заблуждение, потому что они «обманывают» планировщик. Он видит, что это добавило больше работы, и все же нагрузка на процессор не увеличилась.63 Вы должны заменить режим сна плотным циклом, который содержит математику (например, вычисление Sqrt ().
Почему бы просто не иметь один внешний цикл, который считывает элементы из очереди и выполняет их в Задаче. Таким образом, ваше приложение будет максимально использовать доступный параллелизм системы, не перегружая ее.
Может быть стоит взглянуть на следующий ответ:
Библиотека параллельных задач WaitAny Design