-1

目前我有一个 timercallback,它每 100 毫秒调用一次 autoRing 函数来检查是否满足条件(适当的分钟和秒),如果满足,它将调用函数 btnSound_click(响铃)

问题是,我希望铃声只响一次(然后自动再次响起,但我需要的响铃之间的时间是 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//只是常量(整数)。bellSecondsbellMinutesSecond

我尝试将 timercallback 更改为 1000ms,但有两个问题:

  1. 戒指没有像我希望的那样准确。

  2. 不一致,有时会听到 2 声响。

任何帮助深表感谢。

4

1 回答 1

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...
            }
        }
    }
}
于 2013-02-27T06:51:08.790 回答