我已经实现了一个具有数据绑定的DispatcherTimer,它将充当秒表或计数计时器,以显示音频呼叫期间经过的时间。(正如你在手机上看到的那样)
下面的代码每分钟变慢"1秒“,这不利于计算账单。你能告诉我我哪里错了吗?
System.Windows.Threading.DispatcherTimer dispatcherTimer;
int seconds = 0;
public string Counter { get; set; }
public Timer()
{
InitializeComponent();
this.DataContext = this;
dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
Counter = (seconds / 3600).ToString() + ":" + (seconds / 60).ToString("00") + ":" + (seconds % 60).ToString("00");
NotifyPropertyChanged("Counter");
seconds++;
}我将这个计时器与互联网和移动设备上的其他秒表进行了比较,这个计时器每一分钟都会延迟一秒。
发布于 2011-12-20 09:41:23
你依赖于计时器,而它似乎总是不准确。
你为什么不找个时间点把它存储起来
private DateTime startTime;
public Timer()
{
InitializeComponent();
startTime = DateTime.Now;
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
Counter = (DateTime.Now - startTime).ToString();
...
}实际上,像这样的代码显示了为什么会有问题。那里的ToString方法更准确地显示了包括毫秒在内的计数器,结果表明计时器不是每1秒触发一次,而更像是每1.01秒触发一次。
我得到了这样的值,
1.008
1.02
1.031
1.03901等。
然后,您可以将上面的代码替换为这个,
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
TimeSpan elapsedTime = (DateTime.Now - startTime);
Counter = string.Format("{0:hh\\:mm\\:ss}", elapsedTime);它将像以前一样格式化,不会有毫秒。
发布于 2011-12-20 09:39:36
不能保证事件的触发时间间隔恰好是1000ms。您应该计算事件中的秒数,而不是递增您自己的保存秒数的字段
https://stackoverflow.com/questions/8569814
复制相似问题