You need to enable JavaScript to run this app. C# 类Play方法中创建的Timer定时器仅触发一次回调如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 17:33:00