如何在C#中的每个特定时间间隔触发事件?

时间:2014-02-08 08:56:11

标签: c# timer

计时器需要作为一个线程运行,它会在每个固定的时间间隔内触发一个事件。我们怎么能在c#中做到这一点?

4 个答案:

答案 0 :(得分:5)

这是一个简短的片段,每隔10秒打印一条消息。

using System;
public class AClass
{
    private System.Timers.Timer _timer;
    private DateTime _startTime;

    public void Start()
    {
        _startTime = DateTime.Now;
        _timer = new System.Timers.Timer(1000*10); // 10 seconds
        _timer.Elapsed += timer_Elapsed;
        _timer.Enabled = true;
        Console.WriteLine("Timer has started");
    }

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        TimeSpan timeSinceStart = DateTime.Now - _startTime;
        string output = string.Format("{0},{1}\r\n", DateTime.Now.ToLongDateString(), (int) Math.Floor( timeSinceStart.TotalMinutes));
        Console.Write(output);
    }
}

答案 1 :(得分:1)

使用多个可用的计时器之一。 Systme.Timer作为一个通用的,还有其他人依赖于UI技术:

  • System.Timers.Timer
  • System.Threading.Timer
  • System.Windows.Forms.Timer
  • System.Web.UI.Timer
  • System.Windows.Threading.DispatcherTimer

您可以查看Why there are 5 Versions of Timer Classes in .NET?以获取有关差异的说明。

如果您需要具有mroore精度(低至1毫秒)的东西,您可以使用原生计时器 - 但这需要一些互操作编码(或对谷歌的基本理解)。

答案 2 :(得分:1)

您可以使用System.Timers.Timer

试试这个:

class Program
{
    static System.Timers.Timer timer1 = new System.Timers.Timer();
    static void Main(string[] args)
    {
        timer1.Interval = 1000;//one second
        timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Tick);
        timer1.Start();
        Console.WriteLine("Press \'q\' to quit the sample.");
        while (Console.Read() != 'q') ;
    }
    static private void timer1_Tick(object sender, System.Timers.ElapsedEventArgs e)
    {
        //do whatever you want 
        Console.WriteLine("I'm Inside Timer Elapsed Event Handler!");
    }
}

答案 3 :(得分:0)

我更喜欢使用微软的Reactive Framework(NuGet中的Rx-Main)。

var subscription =
    Observable
        .Interval(TimeSpan.FromSeconds(1.0))
        .Subscribe(x =>
        {
            /* do something every second here */
        });

并在不需要时停止计时器:

subscription.Dispose();

超级简单!