结论 *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 都会使线程终止,从而可以回收垃圾 */