none
事件多了的问题 RRS feed

  • 问题

  • 我在写一个Modbus串口通讯的程序,每个地址的数据作为一个对象。加起来共有200多个对象吧。由于数据变化要引起显示界面相应变化,所以我写了很多的Event, 也就是

    AddHandler Adress1Objet, address of Eventxxx
    AddHandler Adress2Objet, address of Eventxxx
    .
    .
    .
    AddHandler AdressnObjet, address of Eventxxx

    事件实质上就是委托,那么是不是一个事件,系统就会另开一个线程,如果是这样,事件太多会不会有资源消耗大的问题?
    2009年12月19日 10:48

答案

  • 你好!
          .NET提供了三种记时器:
         1,System.Timers.Timer:
         这个Timer是使用线程池中的线程去执行任务的,,既然是使用线程池里的线程,就必须在访问任务用到的资源的时候,对线程进行同步!,可以指定某个线程去执行任务,

         2,System.Threading.Timer:
         和1中的Timer类似也是使用线程池中的线程去执行任务的,但是不可以指定的某个线程去执行任务
        
     
         3,System.Windows.Forms.Timer:
         该Timer的特点是执行任务的线程是专属于任务相关窗口的。决不能用这个Timer执行时间太长(例如几分之一秒)的任务,否则会造成界面无响应
        
         根据你的描述,你使用的是第三种,这个Timer会阻塞MainForm的线程,造成界面无响应!最好选择另外两种Timer
         很遗憾,精度的问题无法保证,因为Windows系统并非实时的系统,无法保证这一点!
    周雪峰
    • 已标记为答案 菜鸟学VB 2009年12月21日 3:24
    2009年12月20日 3:19
    版主
  • 不客气啊!
    1,这样可以减少阻塞
    2,另外两个Timer自动进行多线程处理,不用你自己手动处理!
    3,任务的长度!
    周雪峰
    • 已标记为答案 菜鸟学VB 2009年12月21日 3:24
    2009年12月20日 7:44
    版主

全部回复

  • 你好!
         委托也分为同步和异步的!
         除非你显式的使用异步委托,不然默认情况下委托都是同步的会阻塞当前线程的,也就是说不会另外开启新线程了,具体方法可以参考:
         http://msdn.microsoft.com/zh-cn/library/2e08f6yc%28VS.80%29.aspx
    周雪峰
    2009年12月19日 11:33
    版主
  • 谢谢你回答,我会学习下异步委托的。

    但还要借这个话题再问下:如果委托是同步的(我只用了Public Event xxx as EventHandler, 和 Addhandler.., RemoveHandle..,都是默认设置),而我的Mainform,(这个应该是主线程吧)上有个Timer,每秒Tick 1次(主要是完成和串口的通讯周期).这个周期的精度还是很重要的。在这种情况下,如果委托的事件较多,会不会影响这个Timer的Tick精度,比如说有时会大于1秒?

    还有,一般你们怎么保证这个Timer的精度呢?

    多谢回答。
    2009年12月20日 0:06
  • 你好!
          .NET提供了三种记时器:
         1,System.Timers.Timer:
         这个Timer是使用线程池中的线程去执行任务的,,既然是使用线程池里的线程,就必须在访问任务用到的资源的时候,对线程进行同步!,可以指定某个线程去执行任务,

         2,System.Threading.Timer:
         和1中的Timer类似也是使用线程池中的线程去执行任务的,但是不可以指定的某个线程去执行任务
        
     
         3,System.Windows.Forms.Timer:
         该Timer的特点是执行任务的线程是专属于任务相关窗口的。决不能用这个Timer执行时间太长(例如几分之一秒)的任务,否则会造成界面无响应
        
         根据你的描述,你使用的是第三种,这个Timer会阻塞MainForm的线程,造成界面无响应!最好选择另外两种Timer
         很遗憾,精度的问题无法保证,因为Windows系统并非实时的系统,无法保证这一点!
    周雪峰
    • 已标记为答案 菜鸟学VB 2009年12月21日 3:24
    2009年12月20日 3:19
    版主
  • 你好!
          .NET提供了三种记时器:
         1,System.Timers.Timer:
         这个Timer是使用线程池中的线程去执行任务的,,既然是使用线程池里的线程,就必须在访问任务用到的资源的时候,对线程进行同步!,可以指定某个线程去执行任务,

         2,System.Threading.Timer:
         和1中的Timer类似也是使用线程池中的线程去执行任务的,但是不可以指定的某个线程去执行任务
        
     
         3,System.Windows.Forms.Timer:
         该Timer的特点是执行任务的线程是专属于任务相关窗口的。决不能用这个Timer执行时间太长(例如几分之一秒)的任务,否则会造成界面无响应
        
         根据你的描述,你使用的是第三种,这个Timer会阻塞MainForm的线程,造成界面无响应!最好选择另外两种Timer
         很遗憾,精度的问题无法保证,因为Windows系统并非实时的系统,无法保证这一点!
    周雪峰
    非常感谢你的回答,对我很有帮助,但还要请教一下:

    1. 我在Mainform中的Timer Tick事件中用background Worker 来完成例行通讯任务的,这样是不是可以减少Mainform Timer的阻塞问题?
    2. 如果我用另外两种Timer,还能够继续使用BackgroudWorker组件吗,我只会把组件放到Form上。
    3. 您的回答中 "决不能用这个Timer执行时间太长(例如几分之一秒)的任务" ,这个几分之一秒指的是Tick任务的长度,还是Tick的interval设定?
    谢谢。

    2009年12月20日 5:23
  • 不客气啊!
    1,这样可以减少阻塞
    2,另外两个Timer自动进行多线程处理,不用你自己手动处理!
    3,任务的长度!
    周雪峰
    • 已标记为答案 菜鸟学VB 2009年12月21日 3:24
    2009年12月20日 7:44
    版主
  • 如果太复杂的操作还是用多线程来完成
    http://feiyun0112.cnblogs.com/
    2009年12月21日 1:16
    版主
  • 其实不复杂,我就是希望程序能定时没一秒钟执行一些代码。但现在感到用From的Timer,如果主画面中有一些耗时的操作,如读取一个大文件,那么可能Timer的精度就无法保证了。我现在考虑用System.timer.timer,我正在看文档,也就是说,先定义一个timer.tiemr, 然后这个Timer的tick事件的中代码自然就处于另外一个线程了,这样理解对吗?
    2009年12月21日 2:30
  • 你好!
          .NET提供了三种记时器:
         1,System.Timers.Timer:
         这个Timer是使用线程池中的线程去执行任务的,,既然是使用线程池里的线程,就必须在访问任务用到的资源的时候,对线程进行同步!,可以指定某个线程去执行任务,

         2,System.Threading.Timer:
         和1中的Timer类似也是使用线程池中的线程去执行任务的,但是不可以指定的某个线程去执行任务
        
     
         3,System.Windows.Forms.Timer:
         该Timer的特点是执行任务的线程是专属于任务相关窗口的。决不能用这个Timer执行时间太长(例如几分之一秒)的任务,否则会造成界面无响应
        
         根据你的描述,你使用的是第三种,这个Timer会阻塞MainForm的线程,造成界面无响应!最好选择另外两种Timer
         很遗憾,精度的问题无法保证,因为Windows系统并非实时的系统,无法保证这一点!
    周雪峰

    谢谢你的回答,顺便问一下,你所说的"实时系统",指的是那类系统,能给个例子吗?
    2009年12月21日 2:33
  • 比如:VxWorks、μClinux、μC/OS-II和eCos等
    周雪峰
    2009年12月21日 3:00
    版主
  • 比如:VxWorks、μClinux、μC/OS-II和eCos等
    周雪峰

    多谢,学习一下。
    2009年12月21日 7:06
  • 不客气啊!
    周雪峰
    2009年12月21日 7:57
    版主