У меня проблемы с реализацией Parallel, потому что, похоже, периодически появляются сообщения об ошибках.
Я пытаюсь ускорить процесс отображения сложной ViewModel, которая построена с использованием множества навигационных свойств и т. Д.Код ниже является упрощенной непараллельной версией.
var Model = MyRepository.All.AsEnumerable().Select(a => Mapper.Map<Model, ViewModel>(a));
return View(Model);
Это отлично работает, и я никогда не получаю никаких ошибок.Зная, что мое отображение ViewModel было сложным, я решил проверить параллельную версию, чтобы увидеть, была ли она быстрее.Упрощенная версия:
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount};
ConcurrentBag<ViewModel> ViewModel = new ConcurrentBag<ViewModel>();
Parallel.ForEach(Model, options, dr => ViewModel.Add(Mapper.Map<Model,ViewModel>(dr)));
var ViewModelSorted = ViewModel.AsEnumerable().OrderBy(a => a.SortDate);
return View(ViewModelSorted);
Часто завершается и показывает результаты наполовину.Так что это явно быстрее.Однако теперь я иногда получаю сообщения об ошибках об исключениях нулевой ссылки и т. Д. В некоторых из моих методов класса частичных сущностей.Эти ошибки кажутся прерывистыми, даже когда я проверяю одни и те же данные.Я не очень понимаю, почему?Код не изменяет и не обновляет БД и т. Д., И ничто иное не обновляет БД, пока я запускаю код.Разве нельзя использовать Parallel For в этой ситуации?
Обновить сообщение об ошибке:
{"Object reference not set to an instance of an object."}
Трассировка стека:
at SpotList.Domain.Entities.Vessel.GetNextFixture(fixture fixture) in C:\Users\Graeme\documents\visual studio 2010\Projects\SpotList\Domain\Entities\Vessel.cs:line 47
at SpotList.WebUI.Infrastructure.AutoMap.Charterer2.ResolveCore(Vessel source) in C:\Users\Graeme\documents\visual studio 2010\Projects\SpotList\SpotList\Infrastructure\AutoMap\AutoMapperBootstrapper.cs:line 401
at AutoMapper.ValueResolver`2.Resolve(ResolutionResult source)
at AutoMapper.DeferredInstantiatedResolver.Resolve(ResolutionResult source)
at AutoMapper.PropertyMap.ResolveValue(ResolutionContext context)
at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.MapPropertyValue(ResolutionContext context, IMappingEngineRunner mapper, Object mappedObject, PropertyMap propertyMap)
Строка ошибкисоответствует приведенному здесь коду:
public fixture GetNextFixture(fixture fixture)
{
fixtureperiod fixtureperiod = fixture.GetMostRecentFixturePeriod();
Таким образом, фикстура равна нулю, но при запуске непараллельной версии, похоже, никогда не произойдет то же самое1024 *