using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MP.Data.Services
{
///
/// Gestore statistiche esecuzione processi x analisi timing
///
public class ExecStatsCollector : IDisposable
{
#region Public Methods
public void Dispose()
{
TrackData.Clear();
}
///
/// restituisce una stringa da poter emettere in log con il summary degli eventi tracciati ed eventuale reset...
///
///
///
///
public string GetCallSum(string CallName, bool resetCount)
{
string answ = "";
if (TrackData.ContainsKey(CallName))
{
var reqRec = TrackData[CallName];
answ = $"{CallName} | {reqRec.NumCall} x {reqRec.AvgTime:N3}ms | min: {reqRec.MinTime:N3}ms | MAX: {reqRec.MaxTime:N3}ms";
// se richiede reset --> effettuo
if (resetCount)
{
TrackData[CallName].ListMsRec = new List();
}
}
return answ;
}
///
/// Accumula record di tracciamento info esecuzione e restituisce numero elementi finali
///
/// nome chiamata da registrare
/// Durata in ms
///
public int RecordCall(string CallName, double msDuration)
{
if (TrackData.ContainsKey(CallName))
{
TrackData[CallName].ListMsRec.Add(msDuration);
}
else
{
TrackData.Add(CallName, new RecordData() { ListMsRec = new List() { msDuration } });
}
return TrackData[CallName].NumCall;
}
#endregion Public Methods
#region Public Classes
///
/// Record atomico informazioni x un dato task tracciato
///
public class RecordData
{
#region Public Properties
///
/// Tempo medio
///
public double AvgTime
{
get => ListMsRec.Sum(x => x) / (NumCall > 0 ? NumCall : 1);
}
///
/// Lista registrazioni di tempi esecuzione in ms
///
public List ListMsRec { get; set; } = new List();
///
/// Tempo Massimo
///
public double MaxTime
{
get => ListMsRec.OrderByDescending(x => x).FirstOrDefault();
}
///
/// Tempo minimo
///
public double MinTime
{
get => ListMsRec.OrderBy(x => x).FirstOrDefault();
}
///
/// numero registrazioni disponibili
///
public int NumCall
{
get => ListMsRec.Count();
}
#endregion Public Properties
}
#endregion Public Classes
#region Private Fields
///
/// Dizionario di dati statistici accumulati
///
private Dictionary TrackData = new Dictionary();
#endregion Private Fields
}
}