C# 类Play方法中创建的Timer定时器仅触发一次回调如何解决
C# Timer定时器仅触发一次问题解决
问题描述
编写了VideoPost类,其中Play()方法创建了间隔为1秒的Timer定时器,但运行时回调函数仅执行一次,无法按预期重复触发。
原VideoPost类代码
class VideoPost : Post { private int counter; private Timer timer; protected int Duration; protected string VideoUrl; public VideoPost(string title, string user, int duration, string videoUrl): base(title, user) { Duration = duration; VideoUrl = videoUrl; } public void Play() { Console.WriteLine("正在播放视频"); timer = new Timer(TimerCallBack, null, 0, 1000); } public void Stop() { timer.Dispose(); if (counter < Duration) { Console.WriteLine("视频在{0}秒处停止", counter); } else { Console.WriteLine("视频已播放完毕"); } } private void TimerCallBack(Object o) { if (counter < Duration) { Console.WriteLine("当前播放到{0}秒", counter); counter++; } else { Stop(); } } public override string ToString() { return String.Format("帖子 - {0}, {1} 作者 {2}, 视频地址 -> {3} 时长 {4}秒", Id, Title, User, VideoUrl, Duration); } }
原调用代码
VideoPost newVideoPost = new VideoPost("我的堡垒之夜精彩集锦视频", "damilola jerugba", 10, "https://www.video.com/montage.mp4"); Console.WriteLine(newVideoPost.ToString()); newVideoPost.Play();
根因分析
你使用的是System.Threading.Timer,它的回调逻辑是在线程池的异步线程执行的。原调用代码在执行完Play()方法后没有任何阻塞逻辑,主线程直接执行完毕,整个进程退出,定时器后续的回调自然没有执行机会,看起来就只触发了一次。
Timer的构造参数本身没有问题:第三个参数dueTime=0代表启动后立刻触发第一次回调,第四个参数period=1000代表后续每间隔1秒触发一次,定时器配置是正确的。
修复方案
仅需在调用代码末尾增加阻塞逻辑,避免主线程提前退出即可,修复后的调用代码如下:
VideoPost newVideoPost = new VideoPost("我的堡垒之夜精彩集锦视频", "damilola jerugba", 10, "https://www.video.com/montage.mp4"); Console.WriteLine(newVideoPost.ToString()); newVideoPost.Play(); // 新增:等待用户按下任意键再退出程序,给定时器留足执行时间 Console.ReadKey();
如果需要程序自动在播放结束后退出,也可以用Thread.Sleep(11000)等待11秒(匹配10秒的视频时长)再结束进程。
内容的提问来源于stack exchange,提问作者Damiisdandy
相关产品推荐
相关产品推荐

