C#中是否有一个不在Windows.Forms命名空间中的计时器类?

时间:2008-10-03 23:38:20

标签: c# .net scheduling timer

我想在用C#编写的简单.NET应用程序中使用计时器。我能找到的唯一一个是Windows.Forms.Timer类。我不想仅为我的控制台应用程序引用此命名空间。

是否有用于控制台应用程序的C#计时器(或类似计时器)类?

6 个答案:

答案 0 :(得分:29)

答案 1 :(得分:15)

我建议在Timer命名空间中使用System.Timers类。同样感兴趣的是Timer命名空间中的System.Threading类。

using System;
using System.Timers;

public class Timer1
{
    private static Timer aTimer = new System.Timers.Timer(10000);

    public static void Main()
    {
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        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);
    }
}

来自MSDN文档的示例。

答案 2 :(得分:8)

我至少知道System.Timers.TimerSystem.Threading.Timer个类。

有一件事需要注意(如果你之前没有这样做过),请说你的using子句中已经有了System.Threading命名空间,但实际上你想在System.Timers中使用你需要的计时器这样做:

using System.Threading;
using Timer = System.Timers.Timer;
Jon Skeet在他的多线程指南中有一篇关于Timers的文章,值得一读: http://www.yoda.arachsys.com/csharp/threads/timers.shtml

答案 3 :(得分:0)

这个问题很老,现有的答案很好地涵盖了当时的问题。与此同时,发生了一些新的事情。

计时器,确定,为了什么?

使用计时器是一种以一定延迟和/或定期间隔运行某些处理的方法。有两种情况:

(1)它只是定期运行一些短代码,没有任何线程关注,没有麻烦,没有混乱。如果普通的Windows窗体计时器不合适,则System.Timers.Timer及其SynchronizingObject属性使其比System.Threading.Timer更简单。

(2)您正在编码的是异步并发处理领域。传统上,这很容易出错,难以调试,无论使用什么普通计时器都能做到正确。

在第二种情况下,你可能会采用传统方法,但要注意,复杂性潜伏着并准备好吃掉你不只是一次,但任何时候你都没有做出最佳选择,累积效应。

现在我们有了更好的东西

如果您的情况涉及某种"事件"处理(无论它的编码方式如何:按键,鼠标按键,串口的字节,网络连接,测量等),你应该考虑反应式编程。

近年来,反应式编程以某种方式揭示了如何为这些情况编码,而不是陷入复杂陷阱。

因此,从技术上讲,以下链接是问题的答案:它是System.Reactive.Linq命名空间中的计时器:Observable.Timer Method (System.Reactive.Linq)

公平地说,它是一个计时器,可以与Reactive Programming思维模式和许多改变游戏规则的东西一起发挥作用。然而,根据具体情况,它可能是也可能不是最好的工具。

由于此问题以.NET为中心,您可能对Good introduction to the .NET Reactive Framework

感兴趣

或者对于一个清晰的,插图化的,更一般的(不是以微软为中心的)文档,这似乎很好The introduction to Reactive Programming you've been missing

答案 4 :(得分:-2)

System.Diagnostics.Stopwatch如果您的目标是计算运行时间需要多长时间

答案 5 :(得分:-2)

建议不要使用System.Timer的Timer类。