timer的执行顺序问题。

fihuang1 2010-03-02 04:21:22
一个timer不停的循环执行,到了时间点以后触发一个方法F()。
现在有个问题,当timer到了第一个时间点以后执行F(),结果到了第二个时间点的时候前面的F()还没有执行完毕。
这样的会是一个什么情况?是等第一个F()执行完了以后再执行第二个F(),还是会两个F()混合在一起执行。
...全文
464 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgchen 2010-03-03
  • 打赏
  • 举报
回复
我是这样用的,事件开始设Enable为false,并计算运行的总时长,如果时长超过预定的interval,则将interval设得很小,否则将interval设为预定interval-总时长
烈火蜓蜻 2010-03-03
  • 打赏
  • 举报
回复
在开始执行F()前,先停止Timer,然后执行完成后,再开始执行Timer
guyehanxinlei 2010-03-03
  • 打赏
  • 举报
回复
用Timer时一定需要考虑到并发的问题,对临界区资源的访问一定需要加以控制.
可以用Mutex,Monitor等对象来控制
烈火蜓蜻 2010-03-03
  • 打赏
  • 举报
回复
会两个一起执行。

这样就不会了

            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
feelxym 2010-03-03
  • 打赏
  • 举报
回复
引用楼主 fihuang1 的回复:
一个timer不停的循环执行,到了时间点以后触发一个方法F()。
现在有个问题,当timer到了第一个时间点以后执行F(),结果到了第二个时间点的时候前面的F()还没有执行完毕。
这样的会是一个什么情况?是等第一个F()执行完了以后再执行第二个F(),还是会两个F()混合在一起执行。


是会两个F()混合在一起执行
qldsrx 2010-03-03
  • 打赏
  • 举报
回复
还是会顺次执行,但是执行的时间将延后,不会立刻触发要执行的事件,会放在队列里等待,当然此刻单个CPU肯定满负荷运行的。所以你还是在执行一个事件时将计时器停止,完了再开启,或者时间间隔长一点。
lxl369411096 2010-03-03
  • 打赏
  • 举报
回复
个人理解,会重合在一块混用!
stning 2010-03-02
  • 打赏
  • 举报
回复
引用 16 楼 fihuang1 的回复:
引用 15 楼 cja03 的回复:你用System.Timers.Timer的话,可以通过在进入方法时,设置Enable属性为false,方法结束时再设置Enable属性为true timer_Elapsed(.....) {     timer.Enable=false;     .....     timer.Enable=true; }你这个不好,时间间隔其实不是固定的了。我的方法:
timer_Elapsed(.....)
{
    lock(o)
    {
        //...
    }
}
请大家评价。
间隔其实不是固定的,那有什么关系?设置为false了。等到所以的方法走完了,才为true。这个时候才有下一次的事件执行。这样是正确的
fihuang1 2010-03-02
  • 打赏
  • 举报
回复
引用 15 楼 cja03 的回复:
你用System.Timers.Timer的话,可以通过在进入方法时,设置Enable属性为false,方法结束时再设置Enable属性为true


timer_Elapsed(.....)
{
    timer.Enable=false;
    .....
    timer.Enable=true;
}
你这个不好,时间间隔其实不是固定的了。我的方法:
timer_Elapsed(.....)
{
lock(o)
{
//...
}
}
请大家评价。
cja03 2010-03-02
  • 打赏
  • 举报
回复
你用System.Timers.Timer的话,可以通过在进入方法时,设置Enable属性为false,方法结束时再设置Enable属性为true


timer_Elapsed(.....)
{
timer.Enable=false;
.....
timer.Enable=true;
}
stning 2010-03-02
  • 打赏
  • 举报
回复
lz,请参考
stning 2010-03-02
  • 打赏
  • 举报
回复
会有一个代码重用的现象
dc212009 2010-03-02
  • 打赏
  • 举报
回复
引用 11 楼 fihuang1 的回复:
引用 10 楼 dc212009 的回复:引用 7 楼 fihuang1 的回复:声明一下,我用的是System.Timers.Timer。到底是第一个执行完了以后再执行第二个,还是第一个和第二个混合在一起执行啊? MSDN System.Timers.Timer的说明有这么一段: “Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。” 具体请参考: http://msdn.microsoft.com/zh-cn/library/system.timers.timer(VS.80).aspx可重入是什么意思?是不是前后两次触发会混在一起执行?
执行的时候lock一下,就可以让两次触发有先后顺序了。不晓得这个方法怎么样?

可重入,个人理解就是会lz所说的混合执行。 是可以自己通过信号量来控制的啦。
fihuang1 2010-03-02
  • 打赏
  • 举报
回复
引用 10 楼 dc212009 的回复:
引用 7 楼 fihuang1 的回复:声明一下,我用的是System.Timers.Timer。到底是第一个执行完了以后再执行第二个,还是第一个和第二个混合在一起执行啊?
MSDN
System.Timers.Timer的说明有这么一段:

“Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。”
具体请参考:
http://msdn.microsoft.com/zh-cn/library/system.timers.timer(VS.80).aspx
可重入是什么意思?是不是前后两次触发会混在一起执行?
执行的时候lock一下,就可以让两次触发有先后顺序了。不晓得这个方法怎么样?
dc212009 2010-03-02
  • 打赏
  • 举报
回复
引用 7 楼 fihuang1 的回复:
声明一下,我用的是System.Timers.Timer。
到底是第一个执行完了以后再执行第二个,还是第一个和第二个混合在一起执行啊?

MSDN
System.Timers.Timer的说明有这么一段:

“Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。”
具体请参考:
http://msdn.microsoft.com/zh-cn/library/system.timers.timer(VS.80).aspx
fihuang1 2010-03-02
  • 打赏
  • 举报
回复
引用 8 楼 lijunfeng 的回复:
我用Timer控件测试的,是混合在一起执行的
如果真的这样 我可以用lock解决。
lijunfeng 2010-03-02
  • 打赏
  • 举报
回复
我用Timer控件测试的,是混合在一起执行的
fihuang1 2010-03-02
  • 打赏
  • 举报
回复
声明一下,我用的是System.Timers.Timer。
到底是第一个执行完了以后再执行第二个,还是第一个和第二个混合在一起执行啊?
xingyuebuyu 2010-03-02
  • 打赏
  • 举报
回复
timer触发以后还是在主界面的那个线程做的,不会开一个新的线程的
dc212009 2010-03-02
  • 打赏
  • 举报
回复
如果是用的Timer控件,是在主线程执行处理函数的,那么在第一次执行完方法F()前,
应该会阻塞,不会执行第二次的方法F。

如果是启动子线程去执行方法F,那么就会是混合执行了。
加载更多回复(4)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧