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#中关于定时器定时器重入问题如何解决