Files
mapo-iob-man/IOB-MAN.Core/TaskRunStats.cs
T
2025-06-17 09:06:10 +02:00

160 lines
4.3 KiB
C#

using Newtonsoft.Json;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IOB_MAN8.Core
{
public class TaskRunStats
{
#region Public Constructors
/// <summary>
/// init da vuoto
/// </summary>
public TaskRunStats()
{
// init generico senza reload file
}
/// <summary>
/// Init classe con rilettura dati
/// </summary>
public TaskRunStats(string appDir, string confName)
{
AppDir = appDir;
ConfName = confName;
// inizio rileggendo (se presenti) dati conf da disco
tryReload();
}
#endregion Public Constructors
#region Public Properties
/// <summary>
/// Tempo medio complessivo registrato
/// </summary>
public TimeSpan AvgTotalTime
{
get
{
TimeSpan answ = new TimeSpan();
if (TaskData != null && TaskData.Count > 0)
{
foreach (var record in TaskData)
{
answ += record.Value.AvgTime;
}
}
return answ;
}
}
/// <summary>
/// nome del task registrato
/// </summary>
public Dictionary<string, TaskStat> TaskData { get; set; } = new Dictionary<string, TaskStat>();
#endregion Public Properties
#region Public Methods
/// <summary>
/// Tempo medio per un Task
/// </summary>
public TimeSpan AvgTaskTime(string taskName)
{
TimeSpan answ = new TimeSpan();
if (TaskData != null && TaskData.Count > 0)
{
if (TaskData.ContainsKey(taskName))
{
answ = TaskData[taskName].AvgTime;
}
}
return answ;
}
/// <summary>
/// Registro una singola esecuzione x effettuare valutazioni successive...
/// </summary>
/// <param name="taskName"></param>
/// <param name="duration"></param>
public void RecordExeData(string taskName, TimeSpan duration)
{
// cerco nel dizionario se presente
if (TaskData.ContainsKey(taskName))
{
TaskData[taskName].NumRun++;
TaskData[taskName].TotalTime += duration;
}
else
{
TaskData.Add(taskName, new TaskStat() { NumRun = 1, TotalTime = duration });
}
}
/// <summary>
/// Salva le statistiche su disco
/// </summary>
public void SaveToDisk()
{
var rawData = JsonConvert.SerializeObject(TaskData, Formatting.Indented);
if (rawData != null && rawData.Length > 2)
{
File.WriteAllText(StatsPath, rawData);
}
}
#endregion Public Methods
#region Private Fields
private static Logger Log = LogManager.GetCurrentClassLogger();
#endregion Private Fields
#region Private Properties
private string AppDir { get; set; } = "";
private string ConfName { get; set; } = "";
/// <summary>
/// Path file di conf check
/// </summary>
private string StatsPath
{
get => Path.Combine(AppDir, ConfName);
}
#endregion Private Properties
#region Private Methods
private void tryReload()
{
if (File.Exists(StatsPath))
{
string rawData = File.ReadAllText(StatsPath);
if (!string.IsNullOrEmpty(rawData) && rawData.Length > 2)
{
try
{
TaskData = JsonConvert.DeserializeObject<Dictionary<string, TaskStat>>(rawData) ?? new Dictionary<string, TaskStat>();
}
catch (Exception exc)
{
Log.Error($"Eccezione in tryReload:{Environment.NewLine}{exc}");
}
}
}
}
#endregion Private Methods
}
}