diff --git a/VectoCommon/VectoCommon/Utils/Validation.cs b/VectoCommon/VectoCommon/Utils/Validation.cs index ebfe5f6b5d21df369c3ba563e091211e249aaae4..0f8a09e0fae001de5bdf70dfeae665e1deb77048 100644 --- a/VectoCommon/VectoCommon/Utils/Validation.cs +++ b/VectoCommon/VectoCommon/Utils/Validation.cs @@ -114,19 +114,31 @@ namespace TUGraz.VectoCommon.Utils const BindingFlags flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy; - var prop = obj.GetProperty(m.Name, flags); - if (prop != null) { - attributes = prop.GetCustomAttributes(typeof(T)) - .Cast<T>() - .Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>)); + + if (m.MemberType == MemberTypes.Property) { + PropertyInfo prop = m as PropertyInfo ?? obj.GetProperty(m.Name, flags); + //var prop = obj.GetProperty(m.Name, flags); + if (prop != null) + { + //if (m is PropertyInfo prop) { + attributes = prop.GetCustomAttributes(typeof(T)) + .Cast<T>() + .Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>)); + } } - var field = obj.GetField(m.Name, flags); - if (field != null) { - attributes = - attributes.Concat( - field.GetCustomAttributes(typeof(T)).Cast<T>().Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>))); + if (m.MemberType == MemberTypes.Field) { + FieldInfo field = m as FieldInfo ?? obj.GetField(m.Name, flags); + //var field = obj.GetField(m.Name, flags); + if (field != null) + { + //if (m is FieldInfo field) { + attributes = + attributes.Concat( + field.GetCustomAttributes(typeof(T)).Cast<T>().Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>))); + } } + return attributes; } diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs index 5d70de6d7b96c3569973e759548e1aafa5e10131..1de50e55976c3988d07b31c83ef3a116f8a2807c 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs @@ -30,6 +30,7 @@ */ using System; +using System.Collections.Concurrent; using System.Reflection; using System.Text.RegularExpressions; using TUGraz.VectoCommon.Utils; @@ -473,6 +474,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public static class ModalResultFieldExtensionMethods { + private static ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute> _attributeDictionary = + new ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute>(); public static string GetName(this ModalResultField field) { return GetAttribute(field).Name ?? field.ToString(); @@ -480,7 +483,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public static string GetCaption(this ModalResultField field) { - return GetAttribute(field).Caption ?? GetAttribute(field).Name ?? field.ToString(); + var attribute = GetAttribute(field); + return attribute.Caption ?? attribute.Name ?? field.ToString(); } public static string GetShortCaption(this ModalResultField field) @@ -496,7 +500,14 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public static ModalResultFieldAttribute GetAttribute(this ModalResultField field) { - return (ModalResultFieldAttribute)Attribute.GetCustomAttribute(ForValue(field), typeof(ModalResultFieldAttribute)); + var attributeCached = _attributeDictionary.TryGetValue(field, out var attribute); + if (attributeCached) { + return attribute; + } else { + attribute = (ModalResultFieldAttribute)Attribute.GetCustomAttribute(ForValue(field), typeof(ModalResultFieldAttribute)); + _attributeDictionary.TryAdd(field, attribute); + } + return attribute; } private static MemberInfo ForValue(ModalResultField field) diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index eced7a84e0c870660fa6a9234122bfa8f6c303a0..eb7b0ee71169ccb8397289f64937aafa21a25f05 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -76,7 +76,7 @@ namespace TUGraz.VectoCore.OutputData }; // ReSharper restore InconsistentNaming - + private object _tableLock = new object(); internal readonly DataTable Table; private readonly ISummaryWriter _sumWriter; @@ -272,18 +272,29 @@ namespace TUGraz.VectoCore.OutputData /// <summary> /// Writes the result of one run into the summary data container. /// </summary> - [MethodImpl(MethodImplOptions.Synchronized)] + //[MethodImpl(MethodImplOptions.Synchronized)] protected DataRow GetResultRow(IModalDataContainer modData, VectoRunData runData) { - if (modData.HasCombustionEngine) { - UpdateTableColumns(modData.FuelData, runData.EngineData.MultipleEngineFuelModes); + lock (_tableLock) { + if (modData.HasCombustionEngine) + { + UpdateTableColumns(modData.FuelData, runData.EngineData.MultipleEngineFuelModes); + } + + var row = Table.NewRow(); + //Table.Rows.Add(row); + return row; } + } - var row = Table.NewRow(); - Table.Rows.Add(row); - return row; + protected void AddResultRow(DataRow row) + { + lock (_tableLock) { + Table.Rows.Add(row); + } } + //[MethodImpl(MethodImplOptions.Synchronized)] public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData) { var row = GetResultRow(modData, runData); @@ -375,6 +386,8 @@ namespace TUGraz.VectoCore.OutputData } WriteGearshiftStats(modData, row, gearCount); + + AddResultRow(row); }