none
怎么判断Timer的定时事件正在执行? RRS feed

  • 问题

  • 当关闭程序(UI线程), 我需要确保关闭之前, System.threading.Timer的定时事件也结束, 定时事件发生在另外的线程,我可以在这个定时事件的开始和结尾写代码来置一个标志,但我感觉还应该有更简洁的方法,从UI线程直接判断这个Timer的定时事件是否处于执行状态。谢谢指点。

    或者,另外一个相关问题:怎么判断除UI线程之外的子线程是否活跃的?

    2010年1月22日 11:28

答案

  • 你好!
         无须判断,你开启Timer就要在合适的地方关闭Timer,如此而已!
         这个就好象你连接数据库,关闭数据库连接是你应该做的工作,而不是程序结束的时候判断是否数据库还连接,然后再把连接关闭!
    周雪峰
    2010年1月22日 15:39
    版主

全部回复

  • 你好!
         无须判断,你开启Timer就要在合适的地方关闭Timer,如此而已!
         这个就好象你连接数据库,关闭数据库连接是你应该做的工作,而不是程序结束的时候判断是否数据库还连接,然后再把连接关闭!
    周雪峰
    2010年1月22日 15:39
    版主
  • 谢谢,这也就是说, 我先用 
    '停止Timer
    tmrCommunication.Change(0, System.Threading.Timeout.Infinite)
    '再释放资源
    tmrCommunication.dispose()
    '关闭画面(程序)
    Me.close()

    就可以了,不用关心 me.close()的同时是否还有上一个Timer周期引起的定时代码在执行?

    2010年1月25日 2:03
  • 你好!
         清理的Timer的代码,你可以添加到*.Designer.vb文件的Dispose方法中!这个方法会由系统来调用!
         当需要暂时停止Timer,可以使用Stop方法!
    周雪峰
    2010年1月25日 4:06
    版主
  • 谢谢,我用的是System.threading.timer, 所以只能靠Change方法了。

    借这个话题再问一下: 即使Timer的子线程不用我操心,要是我还有其他的子线程,关闭程序前怎么判断呢? 例如, 在Timer的定时代码中,我用了一个异步代理来写一个数据文件,我还是要判断这个线程是否完成工作了吧? 谢谢。
    2010年1月25日 4:28
  • 你好!
         操作数据文件的时候最好使用事务,以免发生意外!
    System.Threading . Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。不建议将其用于 Windows 窗体,因为其回调不在用户界面线程上进行。System.Windows.Forms. Timer 是用于 Windows 窗体的更佳选择。要获取基于服务器的计时器功能,可以考虑使用 System.Timers . Timer ,它可以引发事件并具有其他功能。
    周雪峰
    2010年1月25日 4:53
    版主
  • 谢谢,不过我还是第一次听说"事物“,惭愧! 赶紧搜了一下, 有点复杂,我就是读一个简单的数据文件, 而且,单个数据文件不支持"事务"吧?
    2010年1月26日 5:11