возврат пустого указателя с PLINQ

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

Я попытался использовать PLINQ, использующий.AsParallel ().ForAll (), который значительно ускоряет повторения (который, конечно, он должен сделать), однако, когда набор возвращается, часто существует несколько объектов в том наборе, которые являются несуществующими.

Я предполагаю, что это может быть то, потому что это возвращает набор, прежде чем весь 'бизнес' будет иметь шанс завершиться? если я отлаживаю и вставляю точку останова, нет никаких, аннулирует.

есть ли своего рода, 'ожидают этой операции, которая будет завершена' метод, который я должен использовать?

Править: чтобы быть немного более ясной, существует бизнес-логика в forall, изменяя свойства и т.д. необходимо циклично выполнить действие, вместо того, чтобы просто выбрать что-то.

7
задан benpage 19 February 2010 в 00:59
поделиться

2 ответа

Ответ зависит от того, что вы имеете в виду, когда возвращает , потому что метод ForAll ничего не возвращает. Он вызывает указанный вами делегат параллельно для всех элементов коллекции. Я предполагаю, что ваш код выглядит так:

data.AsParallel().ForAll(() => /* calculate and store result somewhere */);
// more code

Метод ForAll не ждет завершения всех делегатов, поэтому дополнительный код может выполняться до того, как все делегаты завершат работу (и вам также нужно быть осторожным с результатом сохранения где-то бит, потому что он может выполняться одновременно для нескольких делегатов!)

Я думаю, что код можно было бы переписать более элегантно, используя Select method:

var res = data.AsParallel().Select(() => /* calculate the result */);

В этом случае делегат просто возвращает результат. Метод Where собирает все результаты, и при итерации по возвращенному IEnumerable он гарантирует, что все делегаты завершили вычисления.

1
ответ дан 7 December 2019 в 20:36
поделиться

ForAll() не выполняет слияния и возвращается сразу. Parallel.ForEach() - это, вероятно, та функциональность, которую вы ищете.

т.е. вместо:

collection.AsParallel().ForAll( t=>t.doWork() );

что-то вроде

Parallel.ForEach(collection.AsParallel(), t=>t.doWork());

0
ответ дан 7 December 2019 в 20:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: