计时器需要作为一个线程运行,它会在每个固定的时间间隔内触发一个事件。我们怎么能在c#中做到这一点?
答案 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技术:
您可以查看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();
超级简单!