C# 使用Environment.TickCount 实现的时间限制器,限制一定时间内只能执行一次操作,避免频繁操作
之前都是通过DateTime.UtcNow来获取时间间隔,后来发现 Environment.TickCount 相比DateTime.UtvNow快了很多,就用Environment.TickCount实现了个限制器
static void Test() { while (true) { Dosomething(); Thread.Sleep(200); } } static TickLimiter tickLimiter = new TickLimiter(); static void Dosomething() { if (tickLimiter.Limiting("abc_123_@#$", 1000)) { return; } Console.WriteLine(DateTime.Now + " 执行具体业务"); }
/// <summary> /// 时钟限制器,限制一定时间内只能执行一次操作 /// </summary> public class TickLimiter { readonly Dictionary<string, uint> dict = new Dictionary<string, uint>(); uint prev; readonly object _lock = new object(); /// <summary> /// 判断flag操作是否在milliseconds间隔限制内 /// </summary> public bool Limiting(string flag, uint milliseconds) { uint tc = (uint)Environment.TickCount; //4294967295/1000/86400=49.71天后就会从0开始 if (prev > tc) { //如果前一个值大于当前值,就说明从0开始了 lock (_lock) { if (prev > tc) { dict.Clear(); //清空所有记录,避免永远处于限制状态 } } } prev = tc; if (!dict.ContainsKey(flag)) { dict.Add(flag, tc + milliseconds); return false; } if (tc < dict[flag]) { //当前时间未超过上次指定的限制时间就认为是限制中 return true; } dict[flag] = tc + milliseconds; return false; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律