我想在我用 C# 编写的简单.NET应用程序中使用计时器。我能找到的唯一一个是 Windows.Forms.Timer 类。我不想仅为我的控制台应用程序引用这个命名空间。
是否有用于控制台应用程序的 C# 计时器(或类似计时器)类?
我想在我用 C# 编写的简单.NET应用程序中使用计时器。我能找到的唯一一个是 Windows.Forms.Timer 类。我不想仅为我的控制台应用程序引用这个命名空间。
是否有用于控制台应用程序的 C# 计时器(或类似计时器)类?
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
我会推荐命名空间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 文档的示例。
我知道至少有System.Timers.Timer和System.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
这个问题很老,现有的答案很好地涵盖了当时的问题。与此同时,新的事情发生了。
使用计时器是一种以一定延迟和/或定期间隔运行某些处理的方法。有两种情况:
(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。
System.Diagnostics.Stopwatch如果您的目标是计算某项运行所需的时间
建议不要使用System.Timer
Timer 类。