using System.Text;
namespace SHH.MjpegPlayer
{
///
/// 按时间统计
///
public class SumByTime
{
#region Defines
/// 最近刷新在哪一秒
private int LastRefreshSecond = DateTime.Now.Second;
/// 最近刷新在哪一分钟
private int LastRefreshMinute = DateTime.Now.Minute;
/// 最近刷新在哪一小时
private int LastRefreshHour = DateTime.Now.Minute;
/// 秒统计
private Dictionary _second
= new Dictionary();
/// 分钟统计
private Dictionary _minute
= new Dictionary();
/// 小时统计
private Dictionary _hour
= new Dictionary();
/// 累计统计
public Dictionary All { get; init; }
= new Dictionary();
#endregion
#region TotalSecond
/// 秒统计
public Dictionary TotalSecond { get; init; }
= new Dictionary();
#endregion
#region TotalMinute
/// 分统计
public Dictionary TotalMinute { get; init; }
= new Dictionary();
#endregion
#region TotalHour
/// 小时统计
public Dictionary TotalHour { get; init; }
= new Dictionary();
#endregion
#region Refresh
///
/// 刷新方法调用次数
///
///
///
public void Refresh(string methodName, uint count = 1)
{
try
{
#region 秒统计同步
lock (_second)
{
// 确保键存在
if (!_second.ContainsKey(methodName))
_second.Add(methodName, 0);
if (!LastRefreshSecond.Equals(DateTime.Now.Second))
{
LastRefreshSecond = DateTime.Now.Second;
// 获取当前键的快照进行遍历,确保线程安全
var keys = _second.Keys.ToList();
foreach (var key in keys)
{
uint val = _second[key];
if (!TotalSecond.ContainsKey(key))
TotalSecond.Add(key, val);
else
TotalSecond[key] = val;
_second[key] = 0; // 重置当前秒计数值
}
}
_second[methodName] += count;
}
#endregion
#region 分钟统计同步
lock (_minute)
{
if (!_minute.ContainsKey(methodName))
_minute.Add(methodName, 0);
if (!LastRefreshMinute.Equals(DateTime.Now.Minute))
{
LastRefreshMinute = DateTime.Now.Minute;
var keys = _minute.Keys.ToList();
foreach (var key in keys)
{
uint val = _minute[key];
if (!TotalMinute.ContainsKey(key))
TotalMinute.Add(key, val);
else
TotalMinute[key] = val;
_minute[key] = 0;
}
}
_minute[methodName] += count;
}
#endregion
#region 小时统计同步
lock (_hour)
{
if (!_hour.ContainsKey(methodName))
_hour.Add(methodName, 0);
if (!LastRefreshHour.Equals(DateTime.Now.Hour))
{
LastRefreshHour = DateTime.Now.Hour;
var keys = _hour.Keys.ToList();
foreach (var key in keys)
{
uint val = _hour[key];
if (!TotalHour.ContainsKey(key))
TotalHour.Add(key, val);
else
TotalHour[key] = val;
_hour[key] = 0;
}
}
_hour[methodName] += count;
}
#endregion
#region 全量累计同步
lock (All)
{
if (!All.ContainsKey(methodName))
All.Add(methodName, 0);
All[methodName] += (ulong)count;
}
#endregion
}
catch (Exception ex)
{
// 可选:利用 Ayay 项目规范记录日志
// _sysLog.Warning("统计刷新异常: {Msg}", ex.Message);
}
}
#endregion
}
}