码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C# 定时器定时不准确问题


    .NET Framework提供三种Timer


    Server Timers System.Timers.Timer
    Thread Timers System.Threading.Timer
    Windows Timers System.Windows.Forms.Timer

    其中Windows Timers只是提供了和以前的WinAPI 一样的Timer,仍然是基于消息,仍然是单线程, 会有不准时的现象

    其它两个就不同了,他们是基于线程池的Thread Pool,这样最大的好处在于,产生的时间间隔准确均匀。
    Server Timers 和 Thread Timers 的不同在于ServerTimers 是基于事件的,Thread Timers是基于回调函数

    我更喜欢Thread Timer,比较轻量级方便易用。


    思路


    但是这样的Timer也有问题,就是由于时多线程定时器,就会出现如果一个Timer处理没有完成,到了时间下一个
    照样会发生,这就会导致重入问题

    对付重入问题通常的办法是加锁,但是对于 Timer却不能简单的这样做,你需要评估一下

    首先Timer处理里本来就不应该做太需要时间的事情,或者花费时间无法估计的事情,比同远方的服务器建立一个网络连接,这样的做法尽量避免

    如果实在无法避免,那么要评估Timer处理超时是否经常发生,如果是很少出现,那么可以用lock(Object)的方法来防止重入
    如果这种情况经常出现呢?那就要用另外的方法来防止重入了

    我们可以设置一个标志,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就放弃执行
     

    1. static int inTimer = 0;
    2. public static void threadTimerCallback(Object obj)
    3. {
    4. if ( inTiemr == 0 )
    5. {
    6. inTimer = 1;
    7. Console.WriteLine("Time:{0}, \tThread ID:{1}", DateTime.Now, Thread.CurrentThread.GetHashCode());
    8. Thread.Sleep(2000);
    9. inTimer = 0;
    10. }
    11. }



    但是在多线程下给inTimer赋值不够安全,还好Interlocked.Exchange提供了一种轻量级的线程安全的给对象赋值的方法

     

    1. static int inTimer = 0;
    2. public static void threadTimerCallback(Object obj)
    3. {
    4. if ( Interlocked.Exchange(ref inTimer, 1) == 0 )
    5. {
    6. Console.WriteLine("Time:{0}, \tThread ID:{1}", DateTime.Now, Thread.CurrentThread.GetHashCode());
    7. Thread.Sleep(250);
    8. Interlocked.Exchange(ref inTimer, 0);
    9. }
    10. }

  • 相关阅读:
    SIGIR 2021 | UPFD:用户偏好感知假新闻检测
    含文档+PPT+源码等]精品基于Uniapp+SSM实现的酒品移动电商平台app[包运行成功]Android毕业设计Java项目源码论文
    Android 性能优化
    轻松驾驭Hive数仓,数据分析从未如此简单!
    数字IC设计经验整理(二)
    Python计算均值、方差、标准差、协方差等常用指标的方法——Numpy模块+Pandas模块
    原油等特殊期货开户要求和豁免
    【cmake实战十】c++从动态库(dll)导出类
    【C/C++】uin8_t uint16_t uint32_t uint64_t数据类型解析
    媒体编解码器MediaCodec
  • 原文地址:https://blog.csdn.net/qq_36683522/article/details/132919296
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号