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
相关产品推荐
相关产品推荐

