0
private void updateDisplay(Object displayBlock)
    {
        TimeSpan ts = timeWatch.Elapsed;

        if (stopRing == true)
        {
            stopRing = true;
            Thread.Sleep(1000);
            stopRing = false;
        }

        if (ts.Minutes == 0 && ts.Seconds == 10 && ts.Milliseconds <= 100 && stopRing == false)
        {
            stopRing = true;
            btnSound_Click_1(null, null);
        }

        TextBlock db = (TextBlock)displayBlock;
        db.Dispatcher.BeginInvoke(delegate() { db.Text = String.Format("{0:00}:{1:00}", ts.Minutes, ts.Seconds); });


    }

编辑: if(stopRing == true) 的原因是因为将来,我想在下面的函数中添加更多条件,以便它在一段时间后再次响铃,例如:

if (ts.Minutes == 0 && ts.Seconds == 10 && ts.Milliseconds <= 100 && stopRing == false || ts.Minutes == 0 && ts.Seconds == 20 && ts.Milliseconds <= 100 && stopRing == false)

但为了让调试过程更简单,我只设置了 if 条件,以便在 ts.Seconds = 10 时它只响一次。当我按下重置按钮,并且 ts.Seconds 再次从 0 变为 10 时,它应该只响一次,但此时它响了好多次,出乎意料。

我的音效代码是:

private void btnSound_Click_1(object sender, RoutedEventArgs e)
    {
       Stream stream = TitleContainer.OpenStream("sounds/Ding.wav");
       SoundEffect effect = SoundEffect.FromStream(stream);
       FrameworkDispatcher.Update();

       effect.Play();
    }

更新显示函数被调用:

timer = new Timer(new TimerCallback(updateDisplay), textblockTimer, 0, 100);

发生的情况是,如果我将 TimerCallBack 周期切换到较低的值(例如这里看到的 100),SoundEffect 将播放多次,非常快。如果我将 TimerCallBack 增加到更高的值,例如 500,SoundEffect 将播放 2-3 次,有时很快有时会有大约 200 毫秒的延迟。

我的想法已经用完了......我不知道当我将布尔值指定为真时如何播放声音,从而阻止它执行。任何帮助都感激不尽。

(stopRing 定义在代码之上)

编辑:还有几件事要补充:第一轮,SoundEffect 通常播放得很好(只有一次)。但是如果我按下重置按钮并再试一次,大多数情况下 SoundEffect 会播放多次,有时还可以。

这是我的重置按钮代码:

    private void btnReset_Click(object sender, RoutedEventArgs e)
    {
        timeWatch.Stop();
        timeWatch.Reset();
        paused = true;
        btnStartStop.Content = "Start";
        textblockTimer.Text = "00:00";
    }

和我的开始/停止按钮:

private void btnStartStop_Click(object sender, RoutedEventArgs e)
    {
        if (paused == true)
        {
            timeWatch.Start();
            timer = new Timer(new TimerCallback(updateDisplay), textblockTimer, 0, 100);
            paused = false;
            btnStartStop.Content = "Pause";
        }
        else
        {
            timeWatch.Stop();
            paused = true;
            btnStartStop.Content = "Start";
        }
    }
4

2 回答 2

0

有几件事只是在您的代码中尖叫“逻辑错误”:

  • 第二个ifinupdateDisplay检查 的值stopRing,但stopRing此时始终为 false(如果在调用方法时为 true,则前一个代码块将其设置为 false)
  • 您将updateDisplay函数设置为每 100 毫秒调用一次,但它包含Thread.Sleep1000 毫秒。

在这一点上,我不确定究竟是什么导致了您所看到的行为,但这应该为您提供一些调查途径。

于 2013-02-21T17:50:56.033 回答
0

我发现了问题,当我按下重置按钮重新校准计时器时,我需要调用 timer.Dispose() 方法,这样之前的计时器实例就不会干扰新的计时器。

解决了!

那么这是什么意思?这意味着我不必再使用 stopRing 布尔值(不是说它有帮助),从而产生更清晰的代码。

谢谢大家的帮助!

于 2013-02-22T02:53:42.243 回答