c#中关于定时器定时器重入问题如何解决

  

c#中关于定时器定时器重入问题如何解决?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

项目中用到了定时器随着服务启动作定时任务,按指定的准点时间定时执行相关操作,但是在指定准点时间内我只想让它执行一次,要避免重入问题的发生。

首先简单介绍一下计时器,这里所说的计时器是指的System.Timers。计时器,顾名思义,就是可以在指定的间隔是引发事件。官方介绍在这里,摘抄如下:

定时器组件是基于服务器的计时器,它使您能够指定在应用程序中引发过去事件的周期性间隔。然后可通过处理这个事件来提供常规处理。
  例如,假设您有一台关键性服务器,必须每周7天,每天24小时都保持运行。可以创建一个使用计时器的服务,以定期检查服务器并确保系统开启并在运行。
  如果系统不响应,则该服务可以尝试重新启动服务器或通知管理员。
  基于服务器的计时器是为在多线程环境中用于辅助线程而设计的。
  服务器计时器可以在线程间移动来处理引发的过去事件,这样就可以比Windows计时器更精确地按时引发事件。

那使用这个计时器有啥好处呢?主要因为它是通过。线程池净实现的,轻量,计时精确,对应用程序及消息没有特别的要求。

计时器是怎么使用的之前有写过这篇:c#与system . timers . Timer类定时器的使用和定时自动清理内存应用

<强>什么叫重入呢>

<强>关于定时器的重入问题解决方法尝试如下:

1,使用锁锁(对象)的方法来防止重入,表示一个计时器处理正在执行,下一个定时器发生的时候发现上一个没有执行完就<强>等待执行强,适用重入很少出现的场景。在触发的方法中加入锁,这样当线程2进入触发的方法中,发现已经被锁,会等待锁中的代码处理完在执行,代码如下:

私有静态System.Timers。计时器atime=new与system . timers . Timer类();   私有静态对象物料间=新对象();///& lt; summary>///设置定时器///& lt;/summary>   公共静态空间凝固时间()   {//读取配置时间   试一试   {   一次。间隔=30000;   一次。运行新System.Timers.ElapsedEventHandler +=(OnTimedEvent);   一次。AutoReset=true;//每到指定时间经过事件是到时间就触发   一次。启用=true;//指示计时器是否应引发过去事件。   }   捕获(异常交货)   {   LogManager.RecordLog (LogType。错误,“ipad数据同步出错:“+ ex.Message交货);   }   }   私有静态空白>私有静态System.Timers。计时器atime=new与system . timers . Timer类();   私有静态int亲密的=0;///& lt; summary>///设置定时器///& lt;/summary>   公共静态空间凝固时间()   {//读取配置时间   试一试   {   一次。间隔=30000;//半分钟触发一次   一次。运行新System.Timers.ElapsedEventHandler +=(OnTimedEvent);   一次。AutoReset=true;//每到指定时间经过事件是到时间就触发   一次。启用=true;//指示计时器是否应引发过去事件。   }   捕获(异常交货)   {   LogManager.RecordLog (LogType。错误,“ipad数据同步出错:“+ ex.Message交货);   }   }   私有静态空白>感谢各位的阅读!看完上述内容,你们对c#中关于定时器定时器重入问题如何解决大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注行业资讯频道。

c#中关于定时器定时器重入问题如何解决