C# has three timers

时间:2021-06-13 07:44:04

结论 *1.窗体timer和线程timer、计时器timer不同,因为后两者dispose之后,GC可以收集,而前者无法收集 *2.如果一个对象的成员函数正在被执行,那么这个对象肯定不会被收集 *3.要想对无引用的对象进行收集,就必须要终止这个对象的一切timer成员,否则无法收集该对象(因为timer正在使用该对象)。如果不停止timer就直接更改指针(这个对象彻底无法访问了),这就是新时代的内存泄露,程序早晚要内存溢出 *4.timer.stop 和timer.dispose 都会使线程终止,从而可以回收垃圾 */

 using System;
 class TimersTimer
 {
     System.Timers.Timer t;
     public TimersTimer()
     {
         Console.WriteLine("Timers.Timer is created");
         t = new System.Timers.Timer();
         t.Interval = ;
         t.Elapsed += tick;
         t.Start();
     }
     void tick(object o,EventArgs e )
     {
         t.Stop();
         Console.WriteLine("tick is called");
     }
     ~TimersTimer()
     {
         Console.WriteLine("Timers.Timer is died");
     }
 }
 class FormTimer
 {
     System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
     public FormTimer()
     {
         Console.WriteLine("Form.Timer is called");
         t.Interval = ;
         t.Tick += tick;
         t.Start();
     }
     void tick(object o, EventArgs e)
     {
         Console.WriteLine("tick is called");
         t.Dispose();
     }
     ~FormTimer()
     {
         Console.WriteLine("Form.Timer is deleted");
     }
 }
 class ThreadTimer
 {
     System.Threading.Timer t;
     public ThreadTimer()
     {
         Console.WriteLine("thread.timer is called");
         t = , );
     }
     void tick(object o)
     {
         Console.WriteLine("tick is called");
         t.Dispose();
     }
     ~ThreadTimer()
     {
         Console.WriteLine("thread.timer is died");
     }
 }
 class haha
 {
     static void Main()
     {
         new TimersTimer();
         System.Threading.Thread.Sleep();
         GC.Collect();
         System.Windows.Forms.Application.Run();
     }
 }
 /*
  * 结论
  *1.窗体timer和线程timer、计时器timer不同,因为后两者dispose之后,GC可以收集,而前者无法收集
  *2.如果一个对象的成员函数正在被执行,那么这个对象肯定不会被收集
  *3.要想对无引用的对象进行收集,就必须要终止这个对象的一切timer成员,否则无法收集该对象(因为timer正在使用该对象)。如果不停止timer就直接更改指针(这个对象彻底无法访问了),这就是新时代的内存泄露,程序早晚要内存溢出
  *4.timer.stop 和timer.dispose 都会使线程终止,从而可以回收垃圾
 */