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

18

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

是否有适用于控制台应用程序的类似定时器的C#定时器?

6个回答

29

2
这确实回答了问题,但是谈到“最小化”,Spoon的回答更好。 - OJ.

15
我建议您使用System.Timers命名空间中的Timer类。同样值得注意的是,System.Threading命名空间中的Timer类也很有用。
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文档的示例。


8

我知道至少有两个与之相关的类:System.Timers.TimerSystem.Threading.Timer

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

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

Jon Skeet在他的多线程指南中有一篇关于计时器的文章,非常值得一读: https://jonskeet.uk/csharp/threads/timers.html


-1

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

定时器,用来做什么?

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

(1) 它只是定期运行一些简短的代码而不涉及线程问题,没有麻烦,不会出错。如果普通的Windows窗体计时器不适用,则通过其SynchronizingObject属性,System.Timers.TimerSystem.Threading.Timer更为简单。

(2) 你所编写的内容属于异步并发处理的范畴。这传统上容易出错、难以调试、无论使用何种普通计时器都很难正确实现。

对于第2种情况,您可能会采用传统方法,但请注意,复杂性潜伏并准备随时吞噬您,除非您不止一次地做出最佳选择,并产生累积效应。

现在我们有了更好的选择

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

响应式编程在最近几年中以某种方式揭示了如何为这些情况编写代码,同时不会陷入复杂性陷阱。

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

公平地说,这是一个计时器,它与响应式编程思维方式相得益彰,并且有很多改变游戏规则的东西。但是根据上下文,它可能是最好的工具,也可能不是。

由于这个问题是.NET为中心的,您可能会对.NET响应式框架的良好介绍感兴趣。

或者,对于一个清晰、图解、更一般(非微软为中心)的文档,这似乎很好你一直缺少的响应式编程介绍


一条带有响应式框架介绍链接的评论,比像这样的回答更适合作为提示给OP/未来读者。 - Sinatr
@Sinatr,我不理解你的思路,请详细说明一下。第一部分回答了问题,因此它是一个实际的答案。作为奖励,第二部分暗示了其他工具,可以解决著名的“XY问题”可能的情况。你的意思是第二部分使整个答案无效吗?你是什么意思? - Stéphane Gourichon
在我看来,太多的文字和链接支持其他技术,而这应该发表在“反应式框架比X更好”的问题或类似问题中。 想象一下,有一个关于A的问题,而回答是“不要做A,做B”。 除非你清楚地识别了XY问题(在这里我们并没有,控制台应用程序和计时器是完全可以的),否则在7年后回答这样的问题是不应该的。 如果你在评论中提到X,并且OP回复“这看起来很有前途,你能告诉我更多关于X和我的问题吗?”,那么答案就更有道理了(你可以在答案中引用OP的评论)。 - Sinatr
五年零赞,这不正好证明了我的观点吗? - Sinatr
感谢@Sinatr。我现在明白了你的第一条评论。我同意我的答案的第二部分有点“隐藏”/“稀释”了第一部分。第一部分仍然为对话添加了一些内容,我推荐使用System.Timers.Timer而不是System.Threading.Timer。这足以点击“无用”吗?无论如何,经过5年的StackExchange实践,我的水平得到了提高。我想这个问题已经解决了,我们都在进步。再次感谢您的解释。 - Stéphane Gourichon

-2

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


-2

这不是一个计时器,它允许您测量特定代码块的执行时间,但与计时器的作用不同。 - Eric Schoonover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接