Parallelを実装する際に問題が発生しているため、エラーメッセージが断続的に表示されるようです。Parallel for EF4.1とAutomapperを使用していない
私は、多くのナビゲーション所有者などを使用して構築された複雑な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);
多くの場合、半分の時間で結果が完了して表示されます。だから明らかに速いです。しかし、私は時々、私の部分的なエンティティクラスメソッドのいくつかで、null参照例外などに関するエラーメッセージを受け取ることがあります。これらのエラーは、同じデータをテストしても断続的に見えます。なぜ私は本当に理解できないのですか?コードはDBなどを変更したり更新したりせず、コードを実行している間はDBを更新しません。このような状況で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();
ので、治具がしかし、同じnullであります私は非並列版を実行すると決して起こらないようです
のおかげ
グレアム
これらの例外の1つからスタックトレースを送信できますか?私は問題についての考えを持っていますが、私はむしろ情報に基づいた推測をしたいと思います:) – user7116
Ok - 私の投稿を更新します。私は、エラー処理を入れてnullを修正することができましたが、今度はエラーを変更しました。私はそれがEF接続が一度に複数のプロセスによってアクセスされることと関係があると思います。 – GraemeMiller
その行はVessel.csに対応していますか? – user7116