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

System.Timer不触发事件且控制台立即终止问题求助

为什么我的System.Timers.Timer在控制台程序里无法触发Elapsed事件?

嘿,这个问题我之前也碰到过!核心原因其实特别简单——你的控制台程序主线程跑得太快了,Timer还没来得及触发事件,整个程序就直接退出了。

问题根源

当你在控制台程序中创建System.Timers.Timer时,它是运行在后台线程池线程上的。而.NET的运行规则是:只要所有前台线程(比如你的Main方法所在的主线程)都结束了,整个进程就会立刻终止,完全不管后台线程有没有执行完成。你的Main方法执行完创建Timer的代码后就直接结束了,主线程(前台线程)一退出,后台的Timer线程也会被强制终止,所以_timer_Elapsed方法根本没机会执行。

解决方案:让主线程保持活跃

解决思路很直接——想办法让主线程一直处于运行状态,直到你主动终止程序为止。这里有几种常用的方式:

方法1:等待用户输入(最友好)

在Main方法的最后加上一段等待用户输入的代码,这样主线程会一直停留,Timer就能正常每分钟触发一次事件:

using System; 
using System.Timers; 
namespace Test { 
    class Program { 
        static Timer _timer; 
        public static void Main(string[] args) { 
            var timer = new Timer(60000); 
            timer.Elapsed += _timer_Elapsed; // 简化事件绑定写法
            timer.AutoReset = true; // 明确设置重复触发(默认值为true,写出来更清晰)
            timer.Enabled = true; 
            _timer = timer; 

            // 让主线程保持运行,等待用户操作
            Console.WriteLine("Timer已启动,按任意键退出程序...");
            Console.ReadLine();
        } 
        static void _timer_Elapsed(object sender, ElapsedEventArgs e) { 
            Console.WriteLine($"Timer触发于:{DateTime.Now:yyyy-MM-dd HH:mm:ss}"); 
        } 
    } 
}

方法2:让主线程无限休眠

如果你不需要用户交互,可以让主线程无限休眠,这种方式需要用Ctrl+C来手动终止程序:

// 替换Main方法里的Console.ReadLine()
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);

方法3:异步等待(适用于.NET Core/.NET 5+)

如果你的项目基于.NET Core或更高版本,还可以用异步方式让主线程等待:

public static async Task Main(string[] args) { 
    var timer = new Timer(60000); 
    timer.Elapsed += _timer_Elapsed; 
    timer.AutoReset = true; 
    timer.Enabled = true; 
    _timer = timer; 

    await Task.Delay(Timeout.Infinite);
}

额外提示

虽然System.Timers.Timer的AutoReset默认值是true(表示每次触发后自动重置,重复执行),但明确写出这个配置能让代码可读性更强,避免后续维护时产生误解。

内容的提问来源于stack exchange,提问作者l.upo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:07:38