目前我有一个timercallback,它每100ms调用一次autoRing函数来检查是否满足条件(正确的分钟和秒),如果满足,它将调用函数btnSound_click(响铃)
问题是,我希望铃声只响铃ONCE(然后再次自动响铃,但我需要的响铃时间是30秒或更长),但问题是autoRing被多次调用而铃声响了多次在1秒的时间范围内的时间。
所以我按下按钮,执行此代码:
timerSound = new Timer(new TimerCallback(autoRing), null, 0, 100);
和我的自动换行功能:
private void autoRing(Object obj)
{
TimeSpan ts = timeWatch.Elapsed;
if (ts.Minutes == bellMinutesFirst && ts.Seconds == bellSeconds || ts.Minutes == bellMinutesSecond && ts.Seconds == bellSeconds)
{
btnSound_Click_1(null, null);
}
timeWatch只是一个Stopwatch
类,而bellMinutesFirst
/ bellSeconds
/ bellMinutesSecond
只是常量(整数)。
我尝试将timercallback更改为1000ms,但有两个问题:
戒指并不像我希望的那样准确。
不一致,有时会听到2声响起。
非常感谢任何帮助。
答案 0 :(得分:0)
在回调中,您可以跟踪是否轮询,如果您正在等待30秒后响铃。像这样:
enum AutoRingStatus { Polling, Waiting }
AutoRingStatus _autoRingStatus = AutoRingStatus.Polling;
DateTime _autoRingWaitingTill = DateTime.Now;
private void autoRing(Object obj) {
TimeSpan ts = timeWatch.Elapsed;
if (ts.Minutes == bellMinutesFirst && ts.Seconds == bellSeconds || ts.Minutes == bellMinutesSecond && ts.Seconds == bellSeconds) {
if (_autoRingStatus == AutoRingStatus.Polling) {
btnSound_Click_1(null, null);
_autoRingStatus = AutoRingStatus.Waiting;
_autoRingWaitingTill = DateTime.Now.AddSecond(30);
} else {
if (_autoRingWaitingTill <= DateTime.Now) {
_autoRingStatus = AutoRingStatus.Polling;
} else {
// Waiting for the 30s to pass...
}
}
}
}