[转]C#中Timer使用及解决重入问题
- 作者: 五速梦信息网
- 时间: 2026年04月04日 13:58
什么叫重入呢?这是一个有关多线程编程的概念:程序中,多个线程同时运行时,就可能发生同一个方法被多个进程同时调用的情况。当这个方法中存在一些非线程安全的代码时,方法重入会导致数据不一致的情况。Timer方法重入是指使用多线程计时器,一个Timer处理还没有完成,到了时间,另一Timer还会继续进入该方法进行处理。下面演示一下重入问题的产生(可能重现的不是很好,不过也能简单一下说明问题了):
下面显示一下输出结果:

是不是感觉上面输出结果很奇怪,首先是线程1输出为1,没有问题,然后隔了2秒后线程1自增1后输出为2,这就有问题了,中间为什么还出现了线程2的输出?更奇怪的是线程2刚开始输出为1,自增1后尽然变成了3!其实这就是重入所导致的问题。别急,咱们分析一下就知道其中的缘由了。
首先timer启动计时后,开启一个线程1执行方法,当线程1第一次输出之后,这时线程1休眠了2秒,此时timer并没有闲着,因为设置的计时间隔为1秒,当在线程1休眠了1秒后,timer又开启了线程2执行方法,线程2才不管线程1是执行中还是休眠状态,所以此时线程2的输出也为1,因为线程1还在休眠状态,并没有自增。然后又隔了1秒,这时发生同时发生两个事件,线程1过了休眠状态自增输出为2,timer同时又开启一个线程3,线程3输出的为线程1自增后的值2,又过了1秒,线程2过了休眠状态,之前的输出已经是2,所以自增后输出为3,又过了1秒……我都快晕了,大概就是这意思吧,我想表达的就是:一个Timer开启的线程处理还没有完成,到了时间,另一Timer还会继续进入该方法进行处理。
那怎么解决这个问题呢?解决方案有三种,下面一一道来,适应不同的场景,不过还是推荐最后一种,比较安全。
- 上一篇: [转]DB2时间类函数
- 下一篇: [ת]Blue Prism Architecture
相关文章
-
[转]DB2时间类函数
[转]DB2时间类函数
- 互联网
- 2026年04月04日
-
[转]delphi 删除动态数组的指定元素
[转]delphi 删除动态数组的指定元素
- 互联网
- 2026年04月04日
-
[ת]iOS hacking resource collection
[ת]iOS hacking resource collection
- 互联网
- 2026年04月04日
-
[ת]Blue Prism Architecture
[ת]Blue Prism Architecture
- 互联网
- 2026年04月04日
-
[转]Amazon AWS亚马逊云服务免费一年VPS主机成功申请和使用方法
[转]Amazon AWS亚马逊云服务免费一年VPS主机成功申请和使用方法
- 互联网
- 2026年04月04日
-
[转][cesium]1.添加本地服务器
[转][cesium]1.添加本地服务器
- 互联网
- 2026年04月04日






