System.Timers.Timer无法停止问题求助
问题原因及解决方法
你代码里的核心问题是变量遮蔽:类中定义了静态成员aTimer,但在Main方法里又重新声明了一个同名的局部变量,真正启动运行的是这个局部计时器。而OnTimedEvent里访问的是类的静态aTimer,这个静态变量根本没被实例化,所以调用aTimer.Stop()相当于操作一个空对象,完全碰不到正在运行的那个计时器,自然停不下来。
下面是两种可行的解决办法:
方法一:复用类的静态成员
修改Main方法,去掉局部变量的声明,直接给静态成员赋值:
class SortingSysFinal { private static System.Timers.Timer aTimer; public static void Main(String[] args) { // 去掉局部变量声明,直接给静态成员实例化 aTimer = new System.Timers.Timer(); aTimer.Elapsed += OnTimedEvent; aTimer.Interval = 1000; aTimer.Enabled = true; Console.Read(); } private static void OnTimedEvent(object source, ElapsedEventArgs e) { Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime); aTimer.Stop(); } }
方法二:通过事件源获取计时器
不需要依赖静态变量,直接从事件的source参数拿到当前触发事件的计时器,调用它的Stop方法:
class SortingSysFinal { public static void Main(String[] args) { System.Timers.Timer aTimer = new System.Timers.Timer(); aTimer.Elapsed += OnTimedEvent; aTimer.Interval = 1000; aTimer.Enabled = true; Console.Read(); } private static void OnTimedEvent(object source, ElapsedEventArgs e) { Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime); // 将source转换为Timer类型,调用Stop方法 ((System.Timers.Timer)source).Stop(); } }
内容的提问来源于stack exchange,提问作者yungboi22
相关产品推荐
相关产品推荐

