none
timer的回调函数执行时,是否自动使用的新线程呢? RRS feed

  • 问题

  • 系统里好多timer,
     //System.Timers.Timer
                  //System.Threading.Timer
                      //System.Windows.Forms.Timer
    为什么要定义这么多类的计时器呢,它们一般用在哪些不同的方面?
    谢谢。
    如果我希望timer触发执行回调函数时,自动开启一个新线程去执行,我应该用哪一个》?
    2009年9月18日 6:15

答案

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

         2,System.Threading.Timer:
         和1中的Timer类似也是使用线程池中的线程去执行任务的,但是不可以指定的某个线程去执行任务
        
     
         3,System.Windows.Forms.Timer:
         该Timer的特点是执行任务的线程是专属于任务相关窗口的。决不能用这个Timer执行时间太长(例如几分之一秒)的任务,否则会造成界面无响应
        
         前两种都可以满足你的要求!
    周雪峰
    2009年9月18日 11:32
    版主
  • 您好,周版主已介绍的很详细了。

    就1和2而言,其中不推荐1,而应采用2。除非定时器需要支持界面的设计才采用1。实际上1是对2的进一步包装。
    1和2的回调函数因在线程池中运行,因此会自动使用新线程。

    至于3则不会创建新线程,是通过对主窗口所在线程定时发"WM_TIMER"来实现的。

    下面的设计为了测试2的使用:

    static void Main(string[] args)
            {
                Console.WriteLine("Main thread: sarting a timer");
                Console.WriteLine("Main thread:"+Thread.CurrentThread.ManagedThreadId);
                Timer timer = new Timer(ComputeBoundop, 5, 0, 2000);
                Console.WriteLine("Main thread: sarting another work");
                Thread.Sleep(10000);
            }

            static void ComputeBoundop(object o)
            {
                Console.WriteLine(“CallBack thread:”+Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
            }

    2009年9月21日 5:33

全部回复

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

         2,System.Threading.Timer:
         和1中的Timer类似也是使用线程池中的线程去执行任务的,但是不可以指定的某个线程去执行任务
        
     
         3,System.Windows.Forms.Timer:
         该Timer的特点是执行任务的线程是专属于任务相关窗口的。决不能用这个Timer执行时间太长(例如几分之一秒)的任务,否则会造成界面无响应
        
         前两种都可以满足你的要求!
    周雪峰
    2009年9月18日 11:32
    版主
  • 不会的,在CLR里面,每一个进程都会有几个默认的线程,其中有一个线程叫做timer线程,是专门用来触发timer事件了.具体的请参考我的文章:
    http://www.cnblogs.com/killmyday/articles/1394467.html
    2009年9月20日 17:02
  • 您好,周版主已介绍的很详细了。

    就1和2而言,其中不推荐1,而应采用2。除非定时器需要支持界面的设计才采用1。实际上1是对2的进一步包装。
    1和2的回调函数因在线程池中运行,因此会自动使用新线程。

    至于3则不会创建新线程,是通过对主窗口所在线程定时发"WM_TIMER"来实现的。

    下面的设计为了测试2的使用:

    static void Main(string[] args)
            {
                Console.WriteLine("Main thread: sarting a timer");
                Console.WriteLine("Main thread:"+Thread.CurrentThread.ManagedThreadId);
                Timer timer = new Timer(ComputeBoundop, 5, 0, 2000);
                Console.WriteLine("Main thread: sarting another work");
                Thread.Sleep(10000);
            }

            static void ComputeBoundop(object o)
            {
                Console.WriteLine(“CallBack thread:”+Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
            }

    2009年9月21日 5:33