我已经实现了一个带有数据绑定的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++;
}
我将此计时器与互联网和手机中的其他秒表进行了比较,此计时器每分钟都会延迟一秒钟。
答案 0 :(得分:4)
您依赖于计时器,并且它似乎始终不准确相同的数量。
为什么不及时记录,
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);
它的格式就像之前没有毫秒一样。
答案 1 :(得分:1)
您无法确保以1000毫秒的间隔触发事件。您应该计算事件中的秒数,而不是递增持有秒数的字段