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 } }