у меня есть дополнительный метод для IEnumerable, который затем выполняет итерации через набор, ведя его бизнес, и затем возвращает новый IEnumerable.
Я попытался использовать PLINQ, использующий.AsParallel ().ForAll (), который значительно ускоряет повторения (который, конечно, он должен сделать), однако, когда набор возвращается, часто существует несколько объектов в том наборе, которые являются несуществующими.
Я предполагаю, что это может быть то, потому что это возвращает набор, прежде чем весь 'бизнес' будет иметь шанс завершиться? если я отлаживаю и вставляю точку останова, нет никаких, аннулирует.
есть ли своего рода, 'ожидают этой операции, которая будет завершена' метод, который я должен использовать?
Править: чтобы быть немного более ясной, существует бизнес-логика в forall, изменяя свойства и т.д. необходимо циклично выполнить действие, вместо того, чтобы просто выбрать что-то.
Ответ зависит от того, что вы имеете в виду, когда возвращает , потому что метод ForAll
ничего не возвращает. Он вызывает указанный вами делегат параллельно для всех элементов коллекции. Я предполагаю, что ваш код выглядит так:
data.AsParallel().ForAll(() => /* calculate and store result somewhere */);
// more code
Метод ForAll
не ждет завершения всех делегатов, поэтому дополнительный код
может выполняться до того, как все делегаты завершат работу (и вам также нужно быть осторожным с результатом сохранения где-то
бит, потому что он может выполняться одновременно для нескольких делегатов!)
Я думаю, что код можно было бы переписать более элегантно, используя Select
method:
var res = data.AsParallel().Select(() => /* calculate the result */);
В этом случае делегат просто возвращает результат. Метод Where
собирает все результаты, и при итерации по возвращенному IEnumerable
он гарантирует, что все делегаты завершили вычисления.
ForAll()
не выполняет слияния и возвращается сразу. Parallel.ForEach()
- это, вероятно, та функциональность, которую вы ищете.
т.е. вместо:
collection.AsParallel().ForAll( t=>t.doWork() );
что-то вроде
Parallel.ForEach(collection.AsParallel(), t=>t.doWork());