18

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

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

4

6 回答 6

29

System.Timers.Timer

正如 MagicKat 所说:

System.Threading.Timer

您可以在这里看到差异:http: //intellitet.com/system-windows-forms-timer-vs-system-threading-timer-vs-system-timers-timer/

您可以在此处查看 MSDN 示例:

http://msdn.microsoft.com/en-us/library/system.timers.timer(VS.80).aspx

和这里:

http://msdn.microsoft.com/en-us/library/system.threading.timer(VS.80).aspx

于 2008-10-03T23:39:02.223 回答
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 文档的示例。

于 2008-10-03T23:41:53.153 回答
8

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

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

using System.Threading;
using Timer = System.Timers.Timer;

Jon Skeet 在他的多线程指南中有一篇关于定时器的文章,非常值得一读: http ://www.yoda.arachsys.com/csharp/threads/timers.shtml

于 2010-08-01T10:10:28.397 回答
-1

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

定时器,当然,为了什么?

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

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

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

在情况 2 中,您可能会摆脱传统方法,但请注意,复杂性潜伏着并随时会吞噬您,而不仅仅是一次,而是任何时候您没有做出最佳选择,并具有累积效应。

现在我们有了更好的东西

如果您的情况涉及某种“事件”处理(无论其编码方式如何:按键、鼠标按钮、来自串行端口的字节、来自网络连接、来自测量等),您应该考虑响应式编程。

近年来,响应式编程以某种方式揭示了如何针对这些情况进行编码,同时又不陷入复杂性陷阱。

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

公平地说,它是一个计时器,它与反应式编程的思维方式和许多改变游戏规则的东西配合得很好。然而,它可能是也可能不是最好的工具,具体取决于上下文。

由于这个问题是以 .NET 为中心的,您可能对.NET Reactive Framework 的良好介绍感兴趣

或者对于一个清晰的、图解的、更通用的(不是以 Microsoft 为中心的)文档,这看起来不错The Introduction to Reactive Programming you've been missing

于 2015-03-30T16:46:10.450 回答
-2

System.Diagnostics.Stopwatch如果您的目标是计算某项运行所需的时间

于 2008-10-03T23:53:05.377 回答
-2

建议不要使用System.TimerTimer 类。

于 2010-08-01T10:00:37.937 回答