2

我正在尝试在 Windows Phone 7 上制作倒数计时器,这对我的应用程序非常重要。但是我找不到任何方法来每隔一秒更新一次 UI 规则中的文本。

Timer dt = new System.Threading.Timer(delegate
{
 Dispatcher.BeginInvoke(() =>
   {
      newtime = oldtime--;
      System.Diagnostics.Debug.WriteLine("#" + counter.ToString() + 
                                         " new: " + newtime.ToString() + 
                                         " old: " + oldtime.ToString());
      counter++;
      oldtime = newtime;
   }
}, null, 0, 1000);

运行我的应用程序控制台输出后看起来像这样:

#1 new: 445 old: 446
#2 new: 444 old: 445
#3 new: 445 old: 446
#4 new: 443 old: 444
#5 new: 444 old: 445
#6 new: 442 old: 443
#7 new: 443 old: 444
#8 new: 441 old: 442

我不知道如何摆脱那些不需要的调用(#3、#5、#7 等)

谢谢你的任何建议。

4

3 回答 3

0

尝试以下模式:

DispatcherTimer _timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(200) };
int _timeLeft = 50;
Stopwatch watch = new Stopwatch();
public MainPage()
{
InitializeComponent();
_timer.Tick += TimerTick;
_timer.Start();
textBlock1.Text = _timeLeft.ToString();
watch.Start();
}
void TimerTick(object sender, EventArgs e)
{

    if ((_timeLeft - (int)watch.Elapsed.TotalSeconds) <= 0)
    {
        watch.Stop();
        _timer.Stop();
        textBlock1.Text = null;
    }
    else
    {
        textBlock1.Text = (_timeLeft - (int)watch.Elapsed.TotalSeconds).ToString();
    }
}

顺便说一句,Shawn 的代码在我的设备上运行良好,但如果您遇到问题,只需使用 aStopwatch并从您的时间变量中减去经过的时间。此外,运行DispatcherTimer速度更快(当然对于这种技术),例如 200 毫秒,以获得更高的准确度(一切都已在上面实现)。希望有帮助。

于 2012-07-17T07:34:22.230 回答
0

查看代码和注释,我怀疑您的应用程序的错误不在于 Timer 代码,而是与初始化 Timer 的任何内容有关 - 我怀疑计时器被构造了两次。

如果没有看到您发布的块之外的代码,很难调试它,但是您描述的症状表明您正在初始化多个计时器和多个堆栈/闭包变量oldTime,并且newTime

在一个简单的层面上,您可以尝试保护 Timer 构造 - 例如,使用以下内容:

public class MyClass
{

// existing code...

private bool _timerStarted;

private void StartTimer()
{

if (_timerStarted)
{
    Debug.WriteLine("Timer already started - ignoring");
    return;
}

_timerStarted = true;

var newTime = 500;
var oldTime = 500;
var counter = 1;

Timer dt = new System.Threading.Timer(delegate
{
 Dispatcher.BeginInvoke(() =>
   {
      newtime = oldtime--;
      System.Diagnostics.Debug.WriteLine("#" + counter.ToString() + 
                                         " new: " + newtime.ToString() + 
                                         " old: " + oldtime.ToString());
      counter++;
      oldtime = newtime;
   }
}, null, 0, 1000);
}
}
于 2012-07-17T07:47:50.013 回答
0

您应该改用DispatcherTimer。以下示例显示了一个计时器从十开始倒计时。

DispatcherTimer _timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
int _timeLeft = 10;

public MyClass()
{
    InitializeComponent();
    _timer.Tick += TimerTick;
    _timer.Start();
    MyTextBox.Text = _timeLeft.ToString();
}

void TimerTick(object sender, EventArgs e)
{
    _timeLeft--;
    if (_timeLeft == 0)
    {
        _timer.Stop();
        MyTextBox.Text = null;
    }
    else
    {
        MyTextBox.Text = _timeLeft.ToString();
    }
}
于 2012-07-16T22:33:19.517 回答