• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

C#Timer定时器业务代码没执行完又开始下一次定时器调用--解决方案

武飞扬头像
@Crazy Snail
帮助1

方式一:定时器的使能开关

        Timer是定时器,在规定的时间间隔里执行某个方法,但是你方法需要执行时间超过了你定的时间间隔,他并不会继续执行,而是开始执行下一次timer!
比如说现在是12点,timer的方法运行需要5分钟的时间,timer设置的时间间隔为2分钟,到了12:02的时候,timer的方法还没运行完成,他不会接着运行,而是直接开始下一次timer,也就是说你的方法调用了第二遍。

解决方法代码示例:

为了避免这个问题,很多猿在开始执行方法的时候禁用timer, 方法执行完了之后再启用它,这样就能解决这个问题。

  1.  
    private void timer1_Tick(object sender, EventArgs e)
  2.  
    {
  3.  
    timer.enable = false;
  4.  
    //你要执行的方法
  5.  
    timer.enable = true;
  6.  
    }

 方式二:定时器执行加锁--1、用标志位 2、加锁;

代码示例如下:

  1.  
    int flag = 0;//全局变量
  2.  
    if (Interlocked.Exchange(ref flag, 1) == 0)
  3.  
    {
  4.  
    //do something
  5.  
    Interlocked.Exchange(ref flag, 0);
  6.  
    }

补充:

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
系列文章
更多 icon
同类精品
更多 icon
继续加载