当前第2页 返回上一页
1、使用锁lock(Object)的方法来防止重入,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就等待执行,适用重入很少出现的场景。在触发的方法中加入lock,这样当线程2进入触发的方法中,发现已经被锁,会等待锁中的代码处理完在执行,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | private static System.Timers.Timer aTimer = new System.Timers.Timer();
private static object loker= new object ();
/// <summary>
/// 设置定时器
/// </summary>
public static void SetTimer()
{
try
{
aTimer.Interval = 30000;
aTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
aTimer.AutoReset = true ;
aTimer.Enabled = true ;
}
catch (Exception ex)
{
LogManager.RecordLog(LogType.Error, "ipad数据同步出错:" +ex.Message,ex);
}
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
var time =Convert.ToInt32( SynchronousHelper.AppConfig.get_Items( "SycTime" ));
if (DateTime.Now.Hour == time && DateTime.Now.Minute == 0)
{
lock (loker)
{
LogManager.RecordLog(LogType.Info, "数据开始同步时间:" + e.SignalTime, null );
SetTimerStart();
System.Threading.Thread.Sleep(60000);
}
}
}
|
2.置一个标志,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就放弃(注意这里是放弃,而不是等待哦,看看执行结果就明白啥意思了)执行,适用重入经常出现的场景。在多线程下给inTimer赋值不够安全,Interlocked.Exchange提供了一种轻量级的线程安全的给对象赋值的方法(感觉比较高上大,也是比较推荐的一种方法)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | private static System.Timers.Timer aTimer = new System.Timers.Timer();
private static int inTimer = 0;
/// <summary>
/// 设置定时器
/// </summary>
public static void SetTimer()
{
try
{
aTimer.Interval = 30000;
aTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
aTimer.AutoReset = true ;
aTimer.Enabled = true ;
}
catch (Exception ex)
{
LogManager.RecordLog(LogType.Error, "ipad数据同步出错:" +ex.Message,ex);
}
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
var time =Convert.ToInt32( SynchronousHelper.AppConfig.get_Items( "SycTime" ));
if (DateTime.Now.Hour == time && DateTime.Now.Minute == 0)
{
if (Interlocked.Exchange( ref inTimer, 1) == 0)
{
LogManager.RecordLog(LogType.Info, "数据开始同步时间:" + e.SignalTime, null );
SetTimerStart();
System.Threading.Thread.Sleep(60000);
Interlocked.Exchange( ref inTimer, 0);
}
}
}
|
稍微总结一下,timer是一个使用挺简单的类,拿来即用,这里主要总结了使用timer时重入问题的解决,以前也没思考过这个问题,解决方案也挺简单。这里的解决方案同时也适用多线程的重入问题。
以上就是C#中关于Timer定时器重入问题的解决方法的详细内容!
返回前面的内容
相关阅读 >>
.net framework类库的主要功能是什么?
为 jenkins 配置 .net 持续集成环境
c#中关于timer定时器重入问题的解决方法
分享n种.net获取当前路径的的实例
c#中.net框架的简介
解析.net逻辑分层架构
.net是什么
在linux下搭建.net core开发环境教程
c#中匿名委托以及lambda表达式的实例详解
关于c#如何实现access以时间段查询出来的的数据添加到listview中
更多相关阅读请进入《csharp》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » C#中关于Timer定时器重入问题的解决方法