Я был бы готов поспорить, что ответ на Execute вернет поточно-ориентированную IEnumerator
реализацию крайне маловероятно.Тем не менее, это звучит как еще один случай для шаблона «производитель-потребитель» .
В вашем конкретном сценарии я хотел бы, чтобы исходный поток с именем Execute считывал результаты последовательно и вставлял их вBlockingCollection<T>
.Однако прежде чем вы начнете это делать, вы хотите запустить отдельный Task
, который будет контролировать потребление этих предметов, используя Parallel::ForEach
.Теперь вы, вероятно, также захотите изучить использование GetConsumingPartitioner
метода библиотеки ParallelExtensions, чтобы быть наиболее эффективным, так как разделитель по умолчанию создаст больше служебных данных, чем вы хотите в этом случае.Вы можете узнать больше об этом из этого сообщения в блоге .
Дополнительный бонус использования BlockingCollection<T>
над необработанным ConcurrentQueueu<T>
заключается в том, что он предлагает возможность устанавливать границы , что может помешать производителю добавлять в коллекцию больше товаров, чем потребители могут не отставать.Конечно, вам нужно будет провести тестирование производительности, чтобы найти подходящее место для вашего приложения.