首页 > 编程语言 >C# 使用Environment.TickCount 实现的时间限制器,限制一定时间内只能执行一次操作,避免频繁操作

C# 使用Environment.TickCount 实现的时间限制器,限制一定时间内只能执行一次操作,避免频繁操作

时间:2023-08-10 17:59:03浏览次数:47  
标签:C# TickCount Environment flag dict tc TimeLimiter

之前都是通过DateTime.UtcNow来获取时间间隔,后来发现 Environment.TickCount 相比DateTime.UtvNow快了20多倍,就用Environment.TickCount实现了个限制器

测试代码

        static TimeLimiter timeLimiter = new TimeLimiter();
        static void Test() {
            while (true) {
                Dosomething();
                Thread.Sleep(200);
            }
        }
        static void Dosomething() { 
            if (timeLimiter.Limiting("abc_123_@#$", 1000)) {
                return;
            }
            Console.WriteLine(DateTime.Now + " 执行具体业务");
        }
View Code

TimeLimiter

    /// <summary>
    /// 时间限制器,限制一定时间内只能执行一次操作
    /// </summary>
    public class TimeLimiter {
        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;
        }
    }
View Code

 

标签:C#,TickCount,Environment,flag,dict,tc,TimeLimiter
From: https://www.cnblogs.com/luludongxu/p/17621079.html

相关文章

  • 记录一个奇葩的huggingface数据加载问题
    使用dataset=datasets.load_dataset("beyond/rlhf-reward-single-round-trans_chinese")下载数据集会报错:FileNotFoundError:[Errno2]Nosuchfileordirectory:'C:/Users/Chenxm/.cache/huggingface/datasets/beyond___rlhf-reward-single-round-trans_chinese......
  • GIL 锁或将在 CPython 中成为可选项
    哈喽大家好,我是咸鱼几天前有媒体报道称,经过多次辩论,Python指导委员会打算批准通过PEP703提案,让GIL(全局解释器)锁在CPython中成为一个可选项PEP703提案主要目标是使GIL变成可选项,即允许Python解释器在特定情况下不使用GIL这将允许Python在多核处理器上更好地利用......
  • python dict 和 object 相互转换
    pythondict和object的相互转换dict.py借助dict,isinstance来实现对象与字典之间的相互转换defas_dict(obj):ifnothasattr(obj,"__dict__"):returnobjresult={}forkey,valinobj.__dict__.items():ifkey.startswith("_"):......
  • 数据库--etcd数据不一致
    1.查看集群情况,发现db大小不一样,且差距很大[root@localhostkube_etcd]#/home/s/bin/etcdctl--endpoints=https://11.0.1.149:2379,https://11.0.1.150:2379,https://11.0.1.151:2379--cacert=/home/s/cert/kube_etcd/ca.pem--cert=/home/s/cert/kube_etcd/client.pem--......
  • 分治算法C++
    1、光荣的梦想题目描述】Prince对他在这片陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯。在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界、保卫这里的平衡与和谐。在那个时代,平衡是个梦想。因为有很多奇异的物种拥有各种不稳定的能量,平衡瞬间即被打破。KB决定求......
  • 广度优先搜索C++
    1、细胞(1)题目描述一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:阵列4100234500067103456050020456006710000000089有4个细胞。【输入】第一行为矩阵的行n和列m;下面为一个n×m......
  • AI模型部署&推理进阶教程:使用CSK6视觉开发套件拍照并进行物体识别
    前言在已发布的《CSK6AI模型部署教程》系列文章中,我们实现了将训练的LNN模型在CSK6芯片上运行的完整流程:将一张苹果的图片提取到的特征,并打包到了固件里面,然后在固件里去将它送给thinker模型去进行推理,得出一个苹果的一个推理结果。在以往分享的示例中我们的thinker模型是打包WAS......
  • 递归算法练习C++
    1、逆波兰表达式(1)题目描述逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2+3的逆波兰表示法为+23。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2+3)*4的逆波兰表示法为*+234。本题求解逆波兰表达式的值,其中运算符包括......
  • Google C++ 风格指南记录
    最近在看谷歌的C++风格指南发现了一些有意思的知识点,遂记录下1.第六章第二小节介绍了右值引用只在定义移动构造函数与移动赋值操作时使用右值引用.不要使用 std::forward.定义:右值引用是一种只能绑定到临时对象的引用的一种,其语法与传统的引用语法相似.例如, void......
  • ethereum错误之nonce too low
    根据提供的错误信息error(*github.com/ethereum/go-ethereum/rpc.jsonError)*{Code:-32000,Message:"noncetoolow",Data:interface{}nil},这是一个来自以太坊的JSON-RPC错误。该错误的含义是“noncetoolow”,即“交易序号(nonce)过低”。在以太坊中,每个账户都有一个交......