即使定时器多次调用该函数,也只执行一次函数

时间:2013-02-27 06:40:20

标签: c# windows-phone-7

目前我有一个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,但有两个问题:

  1. 戒指并不像我希望的那样准确。

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

  3. 非常感谢任何帮助。

1 个答案:

答案 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...
            }
        }
    }
}