Простой способ гарантировать порядок - последовательно выполнять все задачи TimeConsumingTask в одном фоновом потоке.
Это может занять немного больше времени, чем выполнение нескольких задач TimeConsumingTask в нескольких потоках, но избавит вас от головной боли при попытке синхронизировать результаты и произвести вывод в требуемом порядке.
Если вашей главной целью является освобождение пользовательского интерфейса, чтобы пользователь мог продолжить работу над чем-то другим, разница во времени завершения между использованием одного потока и нескольких потоков, вероятно, незначительна, поэтому идите по самому простому пути - используйте один фоновый поток для всех задач TimeConsuming.
Если ваша основная задача - ускорить вычисление задач TimeConsumingTasks, то, вероятно, лучше использовать несколько потоков, так как он с большей вероятностью использует преимущества нескольких ядер и выполняет часть работы параллельно.
Чтобы сохранить порядок в случае с несколькими потоками, вам придется упорядочить результаты самостоятельно. Вы можете либо сохранить временный список аккумулятора и вставить каждый результат в него в соответствующем месте результата в списке (если местоположение / индекс легко вычисляются или известны), либо добавить дополнительный этап обработки после того, как все потоки завершены, чтобы объединить несколько результатов в окончательный вывод в нужном порядке. В параллельных и распределенных вычислительных кругах процесс разбиения задачи на несколько кусков, выполняемых параллельно, а затем объединения результатов в согласованный порядок называется «сокращением карты».