diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs index 13ba9b48d83207b5fd5fe0422ad03cc52aa0280e..d9a982f8a17e8aea6dd36d1a86144c82ac58b626 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using TUGraz.VectoCommon.InputData; @@ -17,10 +18,9 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.Impl { public abstract class AbstractDeclarationVectoRunDataFactory : LoggingObject, IVectoRunDataFactory { - protected static readonly object CyclesCacheLock = new object(); - protected static readonly Dictionary<MissionType, DrivingCycleData> CyclesCache = - new Dictionary<MissionType, DrivingCycleData>(); + protected static readonly ConcurrentDictionary<MissionType, DrivingCycleData> CyclesCache = + new ConcurrentDictionary<MissionType, DrivingCycleData>(); protected readonly IDeclarationInputDataProvider InputDataProvider; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs index 536bcd20d3881a9b16d9fe01442cc4aca7dc86c3..4b792d4814e09b34b96ab0c089b4640d8f0a335e 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Xml; @@ -28,10 +29,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { public class DeclarationModeCompletedBusVectoRunDataFactory : LoggingObject, IVectoRunDataFactory { - protected static readonly object CyclesCacheLock = new object(); - - protected static readonly Dictionary<MissionType, DrivingCycleData> CyclesCache = - new Dictionary<MissionType, DrivingCycleData>(); + protected static readonly ConcurrentDictionary<MissionType, DrivingCycleData> CyclesCache = + new ConcurrentDictionary<MissionType, DrivingCycleData>(); protected readonly IDeclarationInputDataProvider InputDataProvider; protected IDeclarationReport Report; @@ -229,17 +228,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl } - protected VectoRunData CreateVectoRunDataSpecific(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int modeIdx) - { - DrivingCycleData cycle; - lock (CyclesCacheLock) { - if (CyclesCache.ContainsKey(mission.MissionType)) { - cycle = CyclesCache[mission.MissionType]; - } else { - cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false); - CyclesCache.Add(mission.MissionType, cycle); - } - } + protected VectoRunData CreateVectoRunDataSpecific(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int modeIdx) { + var cycle = CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); var simulationRunData = new VectoRunData { Loading = loading.Key, @@ -274,17 +264,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl } - protected VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int modeIdx) - { - DrivingCycleData cycle; - lock (CyclesCacheLock) { - if (CyclesCache.ContainsKey(mission.MissionType)) { - cycle = CyclesCache[mission.MissionType]; - } else { - cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false); - CyclesCache.Add(mission.MissionType, cycle); - } - } + protected VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int modeIdx) { + var cycle = CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); var primaryBusAuxiliaries = PrimaryVehicle.Components.BusAuxiliaries; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedMultistageBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedMultistageBusVectoRunDataFactory.cs index 05d3dd421eee4e79fc4dee81c66d70bbdbcbb77c..afcd55422c69ef5e338e14dab95c2cae1539fbcd 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedMultistageBusVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedMultistageBusVectoRunDataFactory.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using TUGraz.VectoCommon.Exceptions; @@ -18,15 +19,12 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { public class DeclarationModeCompletedMultistageBusVectoRunDataFactory : LoggingObject, IVectoRunDataFactory { - protected static readonly object CyclesCacheLock = new object(); - protected static readonly Dictionary<MissionType, DrivingCycleData> CyclesCache = - new Dictionary<MissionType, DrivingCycleData>(); - + protected static readonly ConcurrentDictionary<MissionType, DrivingCycleData> CyclesCache = + new ConcurrentDictionary<MissionType, DrivingCycleData>(); protected readonly IMultistageBusInputDataProvider InputDataProvider; protected IDeclarationReport Report; - protected Segment _segmentCompletedBus; protected AxleGearData _axlegearData; protected AngledriveData _angledriveData; @@ -34,7 +32,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl protected RetarderData _retarderData; protected ShiftStrategyParameters _gearshiftData; private DriverData _driverData; - protected DeclarationDataAdapterMultistageBus DataAdapterSpecific = new DeclarationDataAdapterMultistageBus(); @@ -244,20 +241,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl protected VectoRunData CreateVectoRunDataSpecific(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int modeIdx) { - DrivingCycleData cycle; - lock (CyclesCacheLock) - { - if (CyclesCache.ContainsKey(mission.MissionType)) - { - cycle = CyclesCache[mission.MissionType]; - } - else - { - cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false); - CyclesCache.Add(mission.MissionType, cycle); - } - } - + var cycle = CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); + var simulationRunData = new VectoRunData { Loading = loading.Key, @@ -294,16 +279,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl protected VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int modeIdx) { - DrivingCycleData cycle; - lock (CyclesCacheLock) { - if (CyclesCache.ContainsKey(mission.MissionType)) { - cycle = CyclesCache[mission.MissionType]; - } else { - cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false); - CyclesCache.Add(mission.MissionType, cycle); - } - } - + var cycle = CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); + var primaryBusAuxiliaries = PrimaryVehicle.Components.BusAuxiliaries; var simulationRunData = new VectoRunData { diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeHeavyLorryVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeHeavyLorryVectoRunDataFactory.cs index 37545d3f370f03cb8a7a9b1c7f7facd584bb0ff1..475359c981777c774efbb5fd09b23037b01b7a15 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeHeavyLorryVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeHeavyLorryVectoRunDataFactory.cs @@ -147,15 +147,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData; var engineModes = engine.EngineModes; var engineMode = engineModes[modeIdx]; - DrivingCycleData cycle; - lock (CyclesCacheLock) { - if (CyclesCache.ContainsKey(mission.MissionType)) { - cycle = CyclesCache[mission.MissionType]; - } else { - cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false); - CyclesCache.Add(mission.MissionType, cycle); - } - } + + var cycle = CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); + var simulationRunData = new VectoRunData { Loading = loading.Key, VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational), diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModePrimaryBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModePrimaryBusVectoRunDataFactory.cs index 5b54fb576f9f21e3bf02535fa314db9787acf377..511cece77c22db91ed675c475ef2ab0182293f6b 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModePrimaryBusVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModePrimaryBusVectoRunDataFactory.cs @@ -102,15 +102,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var engine = vehicle.Components.EngineInputData; var engineModes = engine.EngineModes; var engineMode = engineModes[modeIdx]; - DrivingCycleData cycle; - lock (CyclesCacheLock) { - if (CyclesCache.ContainsKey(mission.MissionType)) { - cycle = CyclesCache[mission.MissionType]; - } else { - cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false); - CyclesCache.Add(mission.MissionType, cycle); - } - } + + var cycle = CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); + var simulationRunData = new VectoRunData { Loading = loading.Key, VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational), diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs index a4a9cd71a924becbcc9dbceb983a4ad6a7a0bc6e..194b348591e4eb33f57c6f0c123fdd588668a7f5 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs @@ -73,15 +73,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl { var engine = vehicle.Components.EngineInputData; var engineModes = engine.EngineModes; var engineMode = engineModes[modeIdx]; - DrivingCycleData cycle; - lock (CyclesCacheLock) { - if (CyclesCache.ContainsKey(mission.MissionType)) { - cycle = CyclesCache[mission.MissionType]; - } else { - cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false); - CyclesCache.Add(mission.MissionType, cycle); - } - } + + var cycle = CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); + var simulationRunData = new VectoRunData { Loading = loading.Key, VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational), diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs index a3b012014f5105f04337177f7f05bbc81904458a..de50e17655d4aac76abd5f5c3b731a0f3b1b9ea3 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs @@ -42,6 +42,7 @@ using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Impl; +using TUGraz.VectoCore.Utils; [assembly: InternalsVisibleTo("VectoCoreTest")] @@ -133,9 +134,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl CrossWindCorrectionMode.VAirBetaLookupTable; //var ptoTransmissionData = dao.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData); - var drivingCycle = CyclesCache.ContainsKey(cycle.CycleData.Source) - ? CyclesCache[cycle.CycleData.Source] - : DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired); + var drivingCycle = CyclesCache.GetOrAdd(cycle.CycleData.Source, _=>DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired)); var vehicleData = dao.CreateVehicleData(vehicle); yield return new VectoRunData @@ -226,9 +225,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl : null; - var drivingCycle = CyclesCache.ContainsKey(cycle.CycleData.Source) - ? CyclesCache[cycle.CycleData.Source] - : DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired); + var drivingCycle = CyclesCache.GetOrAdd(cycle.CycleData.Source, _=> DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired)); var electricMachines = dao.CreateElectricMachines(vehicle.Components.ElectricMachines,