windows窗体计时器有一点问题。这是一个非常基本的问题,但我环顾四周,似乎找不到答案(我可能应该得到一记耳光)。
我需要能够获取计时器的值,它的经过时间是否大于 500 毫秒的间隔。
就像是
Timer.Elapsed >= 500
Timer.Elapsed
不是返回“经过的时间”的属性 - 这是您订阅的事件。这个想法是该事件每隔一段时间就会触发一次。
目前还不清楚您是否甚至想要一个Timer
- 也许System.Diagnostics.Stopwatch
真的是您所追求的?
var stopwatch = Stopwatch.StartNew();
// Do some work here
if (stopwatch.ElapsedMilliseconds >= 500)
{
...
}
我需要能够获取计时器的值,它的经过时间是否大于 500 毫秒的间隔。
计时器不提供允许您确定已经过去了多少时间的界面。他们唯一做的就是在过期时触发一个事件。
您需要使用其他一些机制(例如Stopwatch
类)来记录时间的流逝。
将 Timer 的 Interval 属性设置为您想要触发的毫秒数(在您的示例中为 500),并为 Tick 事件添加一个事件处理程序。
我写得很快,可能有一些错误,但给你一个大致的想法
Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 500;
timer.Elapsed += (s,a) => {
MyFunction();
timer.Stop();
}
timer.Start();
你不能用Timer
. Elapsed
是达到 0 时触发的事件。
如果您想在事件结束时收听,请注册一个 listen to Elapsed
。Interval
是设置等待时间的成员。
见这里: http: //msdn.microsoft.com/en-us/library/system.timers.timer (v=vs.100).aspx
我提出了一个很简单的解决方案:
1 - 在启动计时器之前,我将当前时间存储在TotalMillisseconds
(来自DateTime.Now.TimeOfDay.TotalMilliseconds
):
double _startingTime = DateTime.Now.TimeOfDay.TotalMilliseconds;
2 - 每次计时器滴答作响,我都会再次获得当前时间,然后我使用一个double
变量来获得这两者之间的差异:
double _currentTime = DateTime.Now.TimeOfDay.TotalMilliseconds;
double _elapsed = _currentTime - _startingTime;
if(_elapsed >= 500)
{
MessageBox.Show("As you command, master!");
_startingTime = _currentTime;
}
if(_currentTime < _startingTime)
_startingTime = _currentTime;
3 - 最后,因为TotalMilliseconds
将返回自 00:00(下午 12 点)以来经过的毫秒数,这意味着当它是午夜时,TotalMilliseconds
将等于 0。在这种情况下,我只检查 是否_currentTime
低于_startingTime
,如果是这样,将 设置_startingTime
为_currentTime
,以便我可以再次计算。
我希望这有帮助
根据我在这里与 David关于Stopwatch
vs的讨论DateTime
,我决定针对需要获得剩余时间的情况发布两种方法(非常简化),以便您决定哪一种更适合您:
public partial class FormWithStopwatch : Form
{
private readonly Stopwatch sw = new Stopwatch();
// Auxiliary member to avoid doing TimeSpan.FromMilliseconds repeatedly
private TimeSpan timerSpan;
public void TimerStart()
{
timerSpan = TimeSpan.FromMilliseconds(timer.Interval);
timer.Start();
sw.Restart();
}
public TimeSpan GetRemaining()
{
return timerSpan - sw.Elapsed;
}
private void timer_Tick(object sender, EventArgs e)
{
// Do your thing
sw.Restart();
}
}
public partial class FormWithDateTime : Form
{
private DateTime timerEnd;
public void TimerStart()
{
timerEnd = DateTime.Now.AddMilliseconds(timer.Interval);
timer.Start();
}
public TimeSpan GetRemaining()
{
return timerEnd - DateTime.Now;
}
private void timer_Tick(object sender, EventArgs e)
{
// Do your thing
timerEnd = DateTime.Now.AddMilliseconds(timer.Interval);
}
}
老实说,我没有看到使用Stopwatch
. 实际上,使用DateTime
. 此外,后者对我来说似乎更清楚一点。