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时它只响一次。当我按下reset按钮,并且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次,有时很快就会播放约200ms的延迟。
我这里的想法已经不多了......我不知道当我将布尔值指定为true时声音如何播放,从而阻止它执行。 任何帮助将不胜感激。
(在代码顶部定义了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";
}
}
答案 0 :(得分:0)
有些事情只是在你的代码中尖叫“逻辑错误”:
if
中的第二个updateDisplay
检查stopRing
的值,但stopRing
此时将始终为false(如果调用该方法时为true,前一段代码将其设置为false)updateDisplay
函数设置为每100毫秒调用一次,但它包含Thread.Sleep
1000毫秒。此时我不确定究竟是什么导致了您所看到的行为,但这应该为您提供一些调查途径。
答案 1 :(得分:0)
我发现了问题,当我按下重置按钮重新校准定时器时,我需要调用timer.Dispose()方法,以便上一个定时器实例不会干扰新定时器。
解决!
那是什么意思? 这意味着我不必再使用stopRing布尔值(不是它有帮助),从而产生更清晰的代码。
谢谢大家的帮助!