none
多个timer并发遇到的问题 RRS feed

  • 问题

  • 我在尝试用二十个timer控制二十个电磁阀的通断,要求是接到信号后延时几十毫秒,再联通几十毫秒之后断开。
    多数时候没有信号但可能同一时刻多个电磁阀收到信号,也可能同一个电磁阀在几十毫秒内连续收到信号

    我在使用threading.timer时遇到的问题是一旦短时间内接到大量信号,个别电磁阀开启后没有正常断开, 看起来好像部分timer无法正确触发
    而换成form.timer能保证正常通断,但同时打开的timer多了却会阻塞用户界面,另外据说form.timer是单线程的,我不知道用它是否能在同时接到多个信号时使相应的电磁阀同时打开,还是说会排队之后串行工作?

    请大家帮忙看看我应该采取什么控制方案,谢谢。
    2009年10月7日 5:24

答案

  • 您好,不客气。下面个人观点请参考,前提是:在确认代码中处理好共享资源的情况下。

    我觉得您提到的系统忙时会有个别的无法触发的异常,是有可能的。

    1、Threading.Timer是用线程池来管理的,无法确定其调用的时间。但.Net是保证会最优化来调用。并且工作线程默认上限是25个线程。也就是说只有满25个才会开始阻塞。

    2、windows不是实时操作系统,我看到您提到的时间都是毫秒级的,这样可能会有问题. 可以尝试让操作系统只执行电磁阀的控制,并且在任务管理器中把应用程序的进程的优先级设置为实时。看看情况是否有好转。
    2009年10月7日 7:42
  • 你好!
         .NET提供了三种记时器:
         1,System.Timers.Timer:
         这个Timer是使用线程池中的线程去执行任务的,使用事件机制来实现!

         2,System.Threading.Timer:
         和1中的Timer类似也是使用线程池中的线程去执行任务的,但是是使用回调函数机制来实现的!
        
     
         3,System.Windows.Forms.Timer:
         该Timer的特点是执行任务的线程是专属于任务相关窗口的。决不能用这个Timer执行时间太长(例如几分之一秒)的任务,否则会造成界面无响应

         你使用的线程数已经超过了线程池的上限,所以可能会发生阻塞,.NET中的记时器似乎都无法满足你的要求,你可以修改一下设计,不要使用如此多的记时器!
    周雪峰
    • 已标记为答案 mba03gl 2009年10月7日 23:28
    2009年10月7日 11:15
    版主

全部回复

  • 您好,Timer实际上有3个,您提到的Form.Timer不是多线程的。请参考我之前和其它朋友的讨论:http://social.microsoft.com/Forums/zh-CN/2212/thread/991b81a9-a82b-4d26-b9da-78e34ad92557

    个人推荐使用Threading.Timer。只要注意处理共享资源即可。没有相关您说的电磁阀的编程经历,但我想原理相同。如果不是很确定问题出在哪了,可以尝试在调试时为断点设置条件,或者编写断言,这样容易发现问题。

    2009年10月7日 6:50
  • 您好,Timer实际上有3个,您提到的Form.Timer不是多线程的。请参考我之前和其它朋友的讨论:http://social.microsoft.com/Forums/zh-CN/2212/thread/991b81a9-a82b-4d26-b9da-78e34ad92557

    个人推荐使用Threading.Timer。只要注意处理共享资源即可。没有相关您说的电磁阀的编程经历,但我想原理相同。如果不是很确定问题出在哪了,可以尝试在调试时为断点设置条件,或者编写断言,这样容易发现问题。

    谢谢。
    我一开始用的的确是Threading.Timer,在信号不多的情况先工作正常,但是当短时间内受到大量触发信号是就会有个别电磁阀常开不断,
    感觉上多线程的threading.timer在系统忙,或同时有多个(>5)threading.timer被触发时,会有个别timer无法正常触发
    2009年10月7日 7:30
  • 您好,不客气。下面个人观点请参考,前提是:在确认代码中处理好共享资源的情况下。

    我觉得您提到的系统忙时会有个别的无法触发的异常,是有可能的。

    1、Threading.Timer是用线程池来管理的,无法确定其调用的时间。但.Net是保证会最优化来调用。并且工作线程默认上限是25个线程。也就是说只有满25个才会开始阻塞。

    2、windows不是实时操作系统,我看到您提到的时间都是毫秒级的,这样可能会有问题. 可以尝试让操作系统只执行电磁阀的控制,并且在任务管理器中把应用程序的进程的优先级设置为实时。看看情况是否有好转。
    2009年10月7日 7:42

  • 1、Threading.Timer是用线程池来管理的,无法确定其调用的时间。但.Net是保证会最优化来调用。并且工作线程默认上限是25个线程。也就是说只有满25个才会开始阻塞。


    对了,我可以把上限调大试试,现在程序理论上启动的最大线程数确实超过25了。
    2009年10月7日 7:52
  • 你好!
         .NET提供了三种记时器:
         1,System.Timers.Timer:
         这个Timer是使用线程池中的线程去执行任务的,使用事件机制来实现!

         2,System.Threading.Timer:
         和1中的Timer类似也是使用线程池中的线程去执行任务的,但是是使用回调函数机制来实现的!
        
     
         3,System.Windows.Forms.Timer:
         该Timer的特点是执行任务的线程是专属于任务相关窗口的。决不能用这个Timer执行时间太长(例如几分之一秒)的任务,否则会造成界面无响应

         你使用的线程数已经超过了线程池的上限,所以可能会发生阻塞,.NET中的记时器似乎都无法满足你的要求,你可以修改一下设计,不要使用如此多的记时器!
    周雪峰
    • 已标记为答案 mba03gl 2009年10月7日 23:28
    2009年10月7日 11:15
    版主
  • 到底是谁帮您先想到线程阻塞的???
    That's unfaire!!!
    2009年10月9日 11:45
  • Jiyuan,你好!
         这个可能是用户不了解可以标记多个回复啊!你的回答是正确的,我已经补充标记了!
         另外,应该是That's unfair!!!,不是unfaire!呵呵!
    周雪峰
    2009年10月9日 13:13
    版主
  • Jiyuan,你好!
         这个可能是用户不了解可以标记多个回复啊!你的回答是正确的,我已经补充标记了!
         另外,应该是That's unfair!!!,不是unfaire!呵呵!
    周雪峰

    哈,多谢周版主!这两天连续碰到类似事件,很晕菜!
    有时候发现回答的越仔细就越不被理会,很无奈。
    感觉花了大力气,得到的回报却是无。如果是我回答不到点子上也就罢了,可有时候明明用我的答案解决问题,却也不被标记,像有个无限循环的问题。我真是无语啊。
    2009年10月9日 13:33
  • 有时候用户常常有自己的一些想法,有关这个问题的一些背景,可能是我们无法了解的!这是文字沟通这种形式本身的问题!
    我们作为为广大用户服务的版主,一定会尽力为大家营造一个良好的沟通氛围,但是毕竟人力有限,可能个别的帖子照顾不到,希望大家可以理解啊!
    我个人感觉,我们来论坛获得的更加重要的东西是结识了很多的同行,彼此交流技术心得,然后共同提高自身的技术水平!从某种意义上说,这比积分,标记数更加的难能可贵!

    周雪峰
    2009年10月9日 13:59
    版主
  • To 雪峰:

    您好,我同意您的观点。

    我也知道这个是文本交流,所以有些模糊的地方,我也无所谓。就是不能接受用了你的答案却不标记的。而且一再遇到就比较郁闷了。

    说到交到朋友,我真正交到的是像您这样的MVP、版主以及热心的朋友。确实是件令人高兴的事。而对那些用了你的答案却对你不理睬的人,我不清楚是否有交的必要啊。

    人非圣贤,目前来说我不可能不在意,我现在是在拼5星用户,是在经历过程,在过程中我很尽力地回答问题,重视答案率,也很重视被认可的程度。不希望自己回了1000个贴,却只有10个答案。在这个过程中,能被标记为答案,就是莫大的欣慰。毕竟我是在用心回答问题,到目前为止我回答的问题,没有说100%也应有99%是通过测试的。哈,越尽力就越希望被认可。

    哈,不好意思让您听我发发牢骚。路还是要继续。我只能以两点来安慰自己:
    1、交到很多优秀的朋友。
    2、大家的学习工作经历不同,观点也就有差异。
    2009年10月9日 14:58
  • 的确啊!
    我也很高兴认识你啊!
    周雪峰
    2009年10月9日 15:45
    版主
  • 的确啊!
    我也很高兴认识你啊!
    周雪峰

    Me too!
    和您交流是件让人愉快的事,日后还有很多事要向您请教啊!
    祝一切如意!:)
    2009年10月9日 15:55
  • 说“请教”太客气了啊!
    以后多多交流啊!
    周雪峰
    2009年10月10日 2:41
    版主
  • 好的,一定一定。:)
    2009年10月10日 4:56