每秒在c#windows窗体应用程序中自定义.wav文件

每秒在c#windows窗体应用程序中自定义.wav文件,c#,audio,C#,Audio,我在播放4秒长波时遇到一些问题。。。我现在正在做的是运行一个计时器 因此,计时器设置为第二个间隔。。。所以每一秒,我都跑去检查一些东西。。。如果该检查失败。。我播放一个wav文件,上面写着“回去工作!” 当前,它暂停计时器。。。。所以我听到“回去工作”,但当它播放时,我已经失去了4秒的计数时间,因为它仍然在播放完声音。。。。这是我的电话和我的功能 playSimpleSound(); private void playSimpleSound() { SoundP

我在播放4秒长波时遇到一些问题。。。我现在正在做的是运行一个计时器

因此,计时器设置为第二个间隔。。。所以每一秒,我都跑去检查一些东西。。。如果该检查失败。。我播放一个wav文件,上面写着“回去工作!”

当前,它暂停计时器。。。。所以我听到“回去工作”,但当它播放时,我已经失去了4秒的计数时间,因为它仍然在播放完声音。。。。这是我的电话和我的功能

playSimpleSound();

    private void playSimpleSound()
    {
        SoundPlayer simpleSound = new SoundPlayer(@"c:\Windows\Media\shortwav.wav");
        simpleSound.PlaySync();
    }
如果我把它们关掉,这样每次点击都能播放。。。。我只听到wav文件的开头

playSimpleSound();

    private void playSimpleSound()
    {
        SoundPlayer simpleSound = new SoundPlayer(@"c:\Windows\Media\shortwav.wav");
        simpleSound.Play();
    }
所以我的问题是

如何继续计数并播放整个wav文件? 我是否应该计算出wav文件的长度,然后用mod进行计数

所以我基本上每x秒播放一次文件


因此,基本上每次只需调用playsound函数,但在该函数中,计算它被访问的次数,并且只在第4秒播放它?

您可以这样做……在不同的线程上播放声音并切换标志:

public partial class Form1 : Form
{

    private SoundPlayer simpleSound; 
    private bool SoundPlaying = false;

    public Form1()
    {
        InitializeComponent();
        this.Load += Form1_Load;
    }

    void Form1_Load(object sender, EventArgs e)
    {
        simpleSound = new SoundPlayer(@"c:\Windows\Media\shortwav.wav");
        simpleSound.LoadAsync();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        Console.WriteLine("Tick");
        if (true) // check your condition
        {
            this.PlaySound();
        }
    }

    private void PlaySound()
    {
        if (!this.SoundPlaying)
        {
            Console.WriteLine("Starting Sound");
            this.SoundPlaying = true;
            Task.Factory.StartNew(() => {
                simpleSound.PlaySync();
                this.SoundPlaying = false;
            });
        }
    }

}

好主意。。效果很好:D