2014-02-07 4 views
3

В функции я хотел бы выполнить параллельную обработку IEnumerable, которая предоставляется в качестве аргумента.Сделать непрозрачный запрос IEnumerable Параллельный (PLINQ)

Это IEnumerable уже является результатом некоторого цепным т.е .:

IEnumerable argument = InitialEnumerable.Select(x => DoHeavyProcessing(x))... 

Но для меня это непрозрачная - я не могу изменить, как создается этот аргумент. Я не знаю, как он построен.

Теперь, когда я вызываю аргумент.AsParallel(), он не делает ничего хорошего - AsParallel() только распараллеливает обработку, которая находится с правой стороны, но вся работа перед этим запускается последовательно.

Вместо этого мне нужно как-то разобрать этот IEnumerable и «украсить» его так, чтобы тяжелая работа была распараллелена.

ответ

3

Нет никакого способа сделать это. IEnumerable специально разработан таким образом, что вы не можете получить заданный элемент до тех пор, пока вы его не достали.

Независимо от того, что генерирует IEnumerable, необходимо предоставить некоторую поддержку для параллелизации генерации этих элементов.

+0

Спасибо, поэтому я думаю, что лучший способ сделать это - сделать мою функцию такой, как: function (ParallelQuery ), чтобы пользователь знал, что он должен использовать AsParallel() где-то, чтобы использовать ее – AdamDabrowski

+2

@ AdamDabrowski Он все равно может принимать подпись типа «IEnumerable», если вызывающий абонент все еще использует что-то вроде «AsParallel» или подобное перед их «Select», что делает дорогостоящую проекцию. Если ваш метод принимает «IEnumerable», просто означает, что любые последующие операции, которые вы выполняете, будут сериализованы. Конечно, если вы принимаете 'ParallelQuery', то основное, что вы делаете, это отправить сигнал вызывающему, что они должны распараллеливать ваш запрос. Если вы хотите это сделать, то обязательно сделайте это. Если большинству абонентов не нужно будет распараллелить свой запрос, хотя ... – Servy

+0

Я знаю, что я могу сохранить более общую подпись (или проверить аргумент/сделать ее позже) - в моем случае последовательные запросы будут обрабатываться по-другому, тогда параллельные (параллельные модели производителей-потребителей с SQLBulkCopy, потребляющими в одном потоке). Я хотел бы, чтобы у пользователя был намек на интерфейс. Спасибо за отличный ответ, Servy! – AdamDabrowski

Смежные вопросы