以下是我正在尝试用作我们正在构建的桌面任务计时器上的已用计时器的代码。现在,当它运行时它只计数到60秒然后重置并且不会添加到分钟。
//tick timer that checks to see how long the agent has been sitting in the misc timer status, reminds them after 5 mintues to ensure correct status is used
private void statusTime_Tick(object sender, EventArgs e)
{
counter++;
//The timespan will handle the push from the elapsed time in seconds to the label so we can update the user
//This shouldn't require a background worker since it's a fairly small app and nothing is resource heavy
var timespan = TimeSpan.FromSeconds(actualTimer.Elapsed.Seconds);
//convert the time in seconds to the format requested by the user
displaycounter.Text=("Elapsed Time in " + statusName+" "+ timespan.ToString(@"mm\:ss"));
//pull the thread into updating the UI
Application.DoEvents();
}
答案 0 :(得分:4)
快速修复
我认为问题在于您使用的是Seconds
,即0-59。您希望将TotalSeconds
与现有代码一起使用:
var timespan = TimeSpan.FromSeconds(actualTimer.Elapsed.TotalSeconds);
<强>评论强>
但是,这并没有多大意义,因为您可以直接使用TimeSpan
对象:
var timespan = actualTimer.Elapsed;
另外,我无法看到您的所有申请,但我希望您不需要致电Application.DoEvents();
。因为UI应该在有机会时自动更新...如果它没有,那么你想看看将阻止UI的任何代码移动到另一个线程。
<强>建议强>
尽管如此,我建议你不要使用计时器来追踪经过的时间。定时器可能随着时间的推移而失去准最好的方法是在开始流程时存储当前系统时间,然后在需要显示“计时器”时。在那时进行按需计算。
一个非常简单的例子来帮助解释我的意思:
DateTime start;
void StartTimer()
{
start = DateTime.Now;
}
void UpdateDisplay()
{
var timespan = DateTime.Now.Subtract(start);
displaycounter.Text = "Elapsed Time in " + statusName + " " + timespan.ToString(@"mm\:ss"));
}
然后,您可以使用计时器定期调用UpdateDisplay
方法:
void statusTime_Tick(object sender, EventArgs e)
{
UpdateDisplay();
}