Параллельно для не работы с EF4.1 и Automapper - PullRequest
3 голосов
/ 23 июня 2011

У меня проблемы с реализацией 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 *

1 Ответ

4 голосов
/ 23 июня 2011

Ваша модель выглядит лениво оцененной структурой, основанной на контексте Entity Framework.Контексты Entity Framework не являются поточно-ориентированными.Попробуйте извлечь все данные из контекста в непараллельной операции, а затем позаботьтесь о сопоставлении как параллельной операции.

Parallel.ForEach(Model.ToList(), ...
...