You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:30:59