C#Timer定时器业务代码没执行完又开始下一次定时器调用--解决方案
方式一:定时器的使能开关
Timer是定时器,在规定的时间间隔里执行某个方法,但是你方法需要执行时间超过了你定的时间间隔,他并不会继续执行,而是开始执行下一次timer!
比如说现在是12点,timer的方法运行需要5分钟的时间,timer设置的时间间隔为2分钟,到了12:02的时候,timer的方法还没运行完成,他不会接着运行,而是直接开始下一次timer,也就是说你的方法调用了第二遍。
解决方法代码示例:
为了避免这个问题,很多猿在开始执行方法的时候禁用timer, 方法执行完了之后再启用它,这样就能解决这个问题。
-
private void timer1_Tick(object sender, EventArgs e)
-
{
-
timer.enable = false;
-
//你要执行的方法
-
timer.enable = true;
-
}
方式二:定时器执行加锁--1、用标志位 2、加锁;
代码示例如下:
-
int flag = 0;//全局变量
-
if (Interlocked.Exchange(ref flag, 1) == 0)
-
{
-
//do something
-
Interlocked.Exchange(ref flag, 0);
-
}
补充:
LONG InterlockedExchange( IN OUT PLONG Target, IN LONG Value ); InterlockedExchange(a,b) 能以原子操作的方式交换俩个参数a, b,并返回a以前的值;因为InterlockedExchange 是原子函数,不会要求中止中断,所以交换指针的方式是安全的。 假设有线程1和线程2调用f()函数,线程1先调用到InterlockedExchange(&g, TRUE);线程2再调用时,函数InterlockedExchange()总返回TRUE,则线程2sleep(0);而直到线程1调用InterlockedExchange(&g, FALSE);后线程2才可能由于调用InterlockedExchange(&g,, TRUE),返回FALSE而退出循环接着工作。这样在//进行其他的操作这里就能操作共享数据而不会引起争议。当然这种方法会浪费cpu时间,因为cpu要不断地执行InterlockedExchange()函数
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfkbjc
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01