获取System.Windows.Forms.Timer的值?

时间:2013-03-20 20:26:06

标签: c# windows forms timer

Windows窗体计时器有点问题。这是一个非常基本的问题,但我环顾四周似乎无法找到答案(我可能应该得到一记耳光)。

我需要能够获得计时器的值,无论其经过的时间是否大于500毫秒的间隔。

类似

Timer.Elapsed >= 500

7 个答案:

答案 0 :(得分:13)

Timer.Elapsed不是返回“已用时间”的属性 - 它是您订阅的事件。这个想法是事件频繁发生。

你是否想要 Timer还不是很清楚 - 也许System.Diagnostics.Stopwatch真的是你所追求的?

var stopwatch = Stopwatch.StartNew();
// Do some work here

if (stopwatch.ElapsedMilliseconds >= 500)
{
    ...
}

答案 1 :(得分:4)

  

我需要能够获得计时器的值,无论其经过的时间是否大于500毫秒的间隔。

计时器不提供允许您确定已经过了多长时间的界面。他们唯一能做的就是在事件到期时开始。

您需要使用其他机制记录时间的流逝,例如Stopwatch类。

答案 2 :(得分:2)

将Timer的Interval属性设置为您要触发的毫秒数(在您的示例中为500),并为Tick事件添加事件处理程序。

答案 3 :(得分:0)

你不能用Timer做到这一点。 Elapsed是在达到0时触发的事件。

如果您想要在事件结束时收听,请注册听取ElapsedInterval是设置等待时间的成员。

见这里: http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.100).aspx

答案 4 :(得分:0)

我写的很快,可能有一些错误,但给你一般的想法

Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 500;
timer.Elapsed += (s,a) => {
  MyFunction();
  timer.Stop();
}
timer.Start();

答案 5 :(得分:0)

基于我与David here关于StopwatchDateTime的讨论,我决定针对需要剩余时间的情况发布两种方法(非常简化) ,因此您可以决定哪个更适合您:

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,实际上您需要的行数更少。此外,后者对我来说似乎更清楚一点。

答案 6 :(得分:0)

我提供了一个简单的解决方案:

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,以便我可以再次计算。

我希望这会有所帮助