【问题标题】:c# timer.elapsed?c# timer.elapsed?
【发布时间】:2012-10-05 22:34:08
【问题描述】:

我已经包含了System.Timers 包,但是当我输入时:

Timer.Elapsed; //its not working, the property elapsed is just not there.

我记得它存在于 VB.NET 中。为什么这不起作用?

【问题讨论】:

标签: c# timer


【解决方案1】:

这不是属性。 It's an event.

因此,您必须提供一个事件处理程序,该处理程序将在每次计时器滴答时执行。像这样的:

public void CreateTimer() 
{
    var timer = new System.Timers.Timer(1000); // fire every 1 second
    timer.Elapsed += HandleTimerElapsed;
}

public void HandleTimerElapsed(object sender, ElapsedEventArgs e)
{
    // do whatever it is that you need to do on a timer
}

【讨论】:

  • 赞成您的答案,因为它更短,因此更清晰,更中肯。
  • 我看到它是System.Timers.ElapsedEventArgs e,但你如何将计时器添加到表单中?我尝试了this.Controls.add(timer),但出现错误。因为它需要 System.Windows.Form.Control
  • 你能解释一下,什么时候使用+= new ElapsedEventHandler(MyHandler),什么时候只使用+= MyHandler
  • @VassilisGr,将事件处理程序与您使用的东西相关联+=;您还可以使用-= 语法删除事件处理程序。
  • 那么第 4 行到底是做什么的呢?每秒调用一次+=右边的函数?
【解决方案2】:

微软的例子。 http://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed.aspx

Elapsed 是一个事件,因此需要一个事件处理程序。

using System;
using System.Timers;

public class Timer1
{
private static System.Timers.Timer aTimer;

public static void Main()
{       
    // Create a timer with a ten second interval.
    aTimer = new System.Timers.Timer(10000);

    // Hook up the Elapsed event for the timer.
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    // Set the Interval to 2 seconds (2000 milliseconds).
    aTimer.Interval = 2000;
    aTimer.Enabled = true;

    Console.WriteLine("Press the Enter key to exit the program.");
    Console.ReadLine();       
}

// Specify what you want to happen when the Elapsed event is  
// raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}
}

/* This code example produces output similar to the following:

Press the Enter key to exit the program.
The Elapsed event was raised at 5/20/2007 8:42:27 PM
The Elapsed event was raised at 5/20/2007 8:42:29 PM
The Elapsed event was raised at 5/20/2007 8:42:31 PM
...
 */

【讨论】:

  • 我在 microsoft 数据库中看到了这个,但我认为它与 private void timer1_Tick(object sender, EventArgs e) 具有相同的功能,但我认为我解决了我的问题。谢谢大家的回答
【解决方案3】:

这里之前的答案都是正确的,但是现在 .net 6 / VS2022 已经发布,并且关于可空性很重要,以上所有答案都会引发编译器警告 CS8622。

解决方案是在回调函数的参数中简单地将源对象标记为可为空,如下所示:

...
    timer.Elapsed += TimerElapsedHandler;
...

public void TimerElapsedHandler(object? source, ElapsedEventArgs e)
{
    //Your Handling Code Here
}

【讨论】:

    【解决方案4】:

    您需要一个事件处理程序,然后在分配事件处理程序时启用并在您的处理程序中停止一个条件

     Timer = new System.Timers.Timer();
     Timer.Elapsed += new System.Timers.ElapsedEventHandler(PageLoaded);
     Timer.Interval = 3000;
     Timer.Enabled = true;
    

    .......

     public void PageLoaded(object source, System.Timers.ElapsedEventArgs e)
            {
                // Do what ever here
                if (StopCondition)Timer.Enabled = false;
              
               
            }
    

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 2016-06-18
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多