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

在.NET Windows Forms中通过Timer实现指定时长音频播放的问题

问题分析与修复方案

你的代码出现音频重复播放且无法停止的核心原因是while循环阻塞了UI线程,导致Timer的Tick事件完全没机会执行,count变量永远停留在0,循环会一直调用sp.Play(),同时后面的停止代码也根本执行不到。另外,SoundPlayer.Play()本身是异步播放的,你反复调用它就会不断触发新的播放请求,这也是重复播放的原因之一。

下面是修复后的完整方案:

第一步:添加类成员变量

首先在你的Form类里添加几个成员变量,用来保存当前播放的音频实例、目标时长和计数:

private SoundPlayer _currentSoundPlayer;
private int _targetPlayDuration;
private int _currentPlayTime;

第二步:重构图片点击事件

移除阻塞线程的while循环,改为启动Timer并一次性启动音频播放:

private void Image_Click(object sender, EventArgs e) {
    // 先停止正在播放的音频(如果有的话)
    StopAudioPlayback();

    var clickedImage = sender as Image;
    if (clickedImage == null) return;

    // 拼接音频路径(用Path.Combine更安全)
    string audioPath = Path.Combine(Environment.CurrentDirectory, "ImageSound", $"{clickedImage.sound}.wav");
    _currentSoundPlayer = new SoundPlayer(audioPath);
    _targetPlayDuration = clickedImage.Duration;
    _currentPlayTime = 0;

    // 设置Timer间隔:假设im.Duration的单位是秒,就设为1000毫秒;如果是毫秒就设为1
    timer1.Interval = 1000;
    timer1.Start();

    // 启动一次音频播放(SoundPlayer.Play()是异步的,会播放完整音频直到我们调用Stop)
    _currentSoundPlayer.Play();
}

第三步:添加停止播放的辅助方法

这个方法用来统一处理停止音频和Timer的逻辑:

private void StopAudioPlayback() {
    timer1.Stop();
    _currentPlayTime = 0;
    _currentSoundPlayer?.Stop();
    _currentSoundPlayer = null;
}

第四步:修改Timer的Tick事件

在Tick事件里计数,达到目标时长就停止播放:

private void timer1_Tick(object sender, EventArgs e) {
    _currentPlayTime++;
    // 检查是否达到目标播放时长
    if (_currentPlayTime >= _targetPlayDuration) {
        StopAudioPlayback();
    }
}

关键说明

  1. 移除while循环:避免阻塞UI线程,让Timer的Tick事件能正常触发计数。
  2. 异步播放控制:SoundPlayer.Play()只调用一次,它会异步播放音频,我们通过Timer来控制播放的时长,到点就调用Stop()终止播放。
  3. 状态重置:每次点击新图片时先停止之前的播放,避免多个音频同时播放,也防止状态混乱。
  4. 路径安全:用Path.Combine拼接文件路径,比直接字符串拼接更可靠,能避免路径分隔符的问题。

注意:如果im.Duration的单位是毫秒,记得把timer1.Interval改成1,这样_currentPlayTime每次加1就代表1毫秒,和时长单位匹配。

内容的提问来源于stack exchange,提问作者Tex_Dex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:26:06