timer的执行顺序问题。 .net里面,timer触发以后,是自动开一个新的线程去做的吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是用的Timer控件,是在主线程执行处理函数的,那么在第一次执行完方法F()前,应该会阻塞,不会执行第二次的方法F。如果是启动子线程去执行方法F,那么就会是混合执行了。 timer触发以后还是在主界面的那个线程做的,不会开一个新的线程的 声明一下,我用的是System.Timers.Timer。到底是第一个执行完了以后再执行第二个,还是第一个和第二个混合在一起执行啊? 我用Timer控件测试的,是混合在一起执行的 如果真的这样 我可以用lock解决。 MSDNSystem.Timers.Timer的说明有这么一段:“Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。”具体请参考:http://msdn.microsoft.com/zh-cn/library/system.timers.timer(VS.80).aspx 可重入是什么意思?是不是前后两次触发会混在一起执行?执行的时候lock一下,就可以让两次触发有先后顺序了。不晓得这个方法怎么样? 你用System.Timers.Timer的话,可以通过在进入方法时,设置Enable属性为false,方法结束时再设置Enable属性为truetimer_Elapsed(.....){ timer.Enable=false; ..... timer.Enable=true;} 你这个不好,时间间隔其实不是固定的了。我的方法:timer_Elapsed(.....){ lock(o) { //... }}请大家评价。 间隔其实不是固定的,那有什么关系?设置为false了。等到所以的方法走完了,才为true。这个时候才有下一次的事件执行。这样是正确的 会两个一起执行。这样就不会了 try { if ( TimeIsUp ) { SysTimer.Change( Timeout.Infinite, this.Config.ChkInterval ); //开始处理服务 this.StartService(); } } catch ( Exception ex ) { } finally { if ( SysTimer != null ) { SysTimer.Change( this.Config.ChkInterval, this.Config.ChkInterval ); } } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Linux7985/archive/2010/01/10/5169375.aspx 用Timer时一定需要考虑到并发的问题,对临界区资源的访问一定需要加以控制.可以用Mutex,Monitor等对象来控制 在开始执行F()前,先停止Timer,然后执行完成后,再开始执行Timer 我是这样用的,事件开始设Enable为false,并计算运行的总时长,如果时长超过预定的interval,则将interval设得很小,否则将interval设为预定interval-总时长 还是会顺次执行,但是执行的时间将延后,不会立刻触发要执行的事件,会放在队列里等待,当然此刻单个CPU肯定满负荷运行的。所以你还是在执行一个事件时将计时器停止,完了再开启,或者时间间隔长一点。 C#命令行参数问题 C#的WinForm编程子窗体换行问题? combobox自动搜索的问题 如何用c# webbrower获取页面的html代码 在线状态的更新问题! 写文件出错 怎样判断一句话中有几个单词 服务器端上传文件代码如何编写? 新手学习c# C#做五子棋界面 C#开发ERP问题讨论 如何引用相对路径的DLL,非反射方法
应该会阻塞,不会执行第二次的方法F。如果是启动子线程去执行方法F,那么就会是混合执行了。
到底是第一个执行完了以后再执行第二个,还是第一个和第二个混合在一起执行啊?
System.Timers.Timer的说明有这么一段:“Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。”
具体请参考:
http://msdn.microsoft.com/zh-cn/library/system.timers.timer(VS.80).aspx
执行的时候lock一下,就可以让两次触发有先后顺序了。不晓得这个方法怎么样?
timer_Elapsed(.....)
{
timer.Enable=false;
.....
timer.Enable=true;
}
timer_Elapsed(.....)
{
lock(o)
{
//...
}
}
请大家评价。
{
if ( TimeIsUp )
{
SysTimer.Change( Timeout.Infinite, this.Config.ChkInterval );
//开始处理服务
this.StartService();
}
}
catch ( Exception ex ) { }
finally
{
if ( SysTimer != null )
{
SysTimer.Change( this.Config.ChkInterval, this.Config.ChkInterval );
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Linux7985/archive/2010/01/10/5169375.aspx
可以用Mutex,Monitor等对象来控制