Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 播放wav文件后启动秒表_C#_Audio_Wav_Stopwatch - Fatal编程技术网

C# 播放wav文件后启动秒表

C# 播放wav文件后启动秒表,c#,audio,wav,stopwatch,C#,Audio,Wav,Stopwatch,我正在制作秒表,我想在比赛中使用它。我想通过点击按钮1启动我的秒表,以便播放第一个wav文件,然后秒表启动。但是秒表不能启动。这就是我到现在为止所做的 Stopwatch sw = new Stopwatch(); private void button1_Click(object sender, EventArgs e) { new System.Threading.Thread(testMethod).Start(); }

我正在制作秒表,我想在比赛中使用它。我想通过点击按钮1启动我的秒表,以便播放第一个wav文件,然后秒表启动。但是秒表不能启动。这就是我到现在为止所做的

        Stopwatch sw = new Stopwatch();

    private void button1_Click(object sender, EventArgs e)
    {
        new System.Threading.Thread(testMethod).Start();
    }

    private void testMethod(object obj)
    {
        System.Media.SoundPlayer sp = new System.Media.SoundPlayer(@"D:\...\something.wav");
        sp.Play();

    }

    void OnSoundPlayOver(object sender, EventArgs e)
    {
        timer1.Start();
        timer2.Start();
        sw.Start();

    }

如果您的要求是:

  • 开始按钮,播放声音,然后启动计时器,在屏幕上显示经过的时间
  • 停止按钮,停止任何当前计时器,将最后一个值保留在屏幕上
  • 在Windows窗体中实现
下面的代码是如何使上述需求正常工作的基本示例。它利用SoundPlayer的PlaySync方法、BackgroundWorker(将标签上的值更新为经过的秒数)和秒表来实际记录经过的时间。这肯定不是实现这一目标的最佳方式,但它应该为您提供一个起点

需要注意的一个重要事项是,不能从与创建标签的线程(通常是UI线程)不同的线程更新标签。因此,如果您试图从另一个线程更新标签文本,则需要使用labels.Invoke方法(请参阅下面代码中的ThreadSafeUpdateLabel方法)

此代码不考虑以下情况:有人单击“开始”按钮(它只会在您单击时多次播放声音),而当您单击“开始”按钮时,只要播放声音,UI就会冻结。我将把解决这些问题作为代码的自然扩展留给您

无论如何,在代码上:

private Stopwatch _timer = new Stopwatch();
private BackgroundWorker _worker;

private void btnStop_Click(object sender, EventArgs e)
{
    CancelExistingBackgroundWorker();
    _timer.Stop();
}

private void btnStart_Click(object sender, EventArgs e)
{
    CancelExistingBackgroundWorker();
    _timer.Reset();
    UpdateLabel(0);

    _worker = new BackgroundWorker() { WorkerSupportsCancellation = true };
    _worker.DoWork += (a, b) => 
    { 
        while (true) 
        {
            if ((a as BackgroundWorker).CancellationPending) return;
            ThreadSafeUpdateLabel();
            Thread.Sleep(100);
        } 
    };

    var soundPlayer = new SoundPlayer("wavfile.wav");
    soundPlayer.PlaySync();

    _timer.Start();
    _worker.RunWorkerAsync();
}


private void ThreadSafeUpdateLabel()
{
    if (lblElapsed.InvokeRequired)
    {
        lblElapsed.Invoke(new Action(() => ThreadSafeUpdateLabel()));
    }
    else
    {
        UpdateLabel(_timer.Elapsed.TotalSeconds);
    }
}

private void UpdateLabel(double seconds)
{
    lblElapsed.Text = seconds.ToString();
}

private void CancelExistingBackgroundWorker()
{
    if (_worker != null)
    {
        _worker.CancelAsync();
        _worker.Dispose();
    }
}

好的,但你的问题是什么?我忘了告诉你计时器不想启动。有什么建议吗???你怎么知道秒表还没有启动?,
sw.IsRunning=false
sw.appeased=TimeSpan.Zero
?很抱歉我对c语言编程的了解不多。我看到的是,应该显示timespan的label1上没有变化。当我使用秒表并通过单击按钮1对其进行编程时,它工作得非常好。我看到您正在更新SoundPlayer,但我看不到您将OnSoundPlayOver事件处理程序添加到SoundPlayer的位置