工作中需要用到定时器,随手一搜发现搜到的内容繁简不一,深浅不同。故自行整理,以便日后查阅。(本人才疏学浅,如有问题烦请指正。)
一般Timer类一览
- System.Threading.Timer
- System.Timers.Timer
- System.Windows.Forms.Timer
- System.Windows.Threading.DispatcherTimer
看到这,你一定觉得很烦躁,我到底选什么呢?推荐一个微软文档的链接,里面清楚的讲述了其中三者的区别。至于System.Windows.Threading.DispatcherTimer还需继续查阅。
Comparing the Timer Classes in the .NET Framework Class Library
下面是文中简要的对比:
System.Windows.Forms | System.Timers | System.Threading | |
---|---|---|---|
Timer event runs on what thread? | UI thread | UI or worker thread | Worker thread |
Instances are thread safe? | No | Yes | No |
Familiar/intuitive object model? | Yes | Yes | No |
Requires Windows Forms? | Yes | No | No |
Metronome-quality beat? | No | Yes* | Yes* |
Timer event supports state object? | No | No | Yes |
Initial timer event can be scheduled? | No | No | Yes |
Class supports inheritance? | Yes | Yes | No |
使用
System.Threading.Timer
以最常用的构造函数来介绍:
public Timer(TimerCallback callback, object state, int dueTime, int period);
- Callback 重复执行的委托
- state 委托传递的对象
- dueTime Callback开始执行的延迟
- period 执行委托的间隔
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Test;
using System.Threading;
namespace ConsoleApp4
{
class Program
{
private static int id;
static void Main(string[] args)
{
List<int> list = new List<int>();
Timer timer = new Timer(Callback, list, 0, 100);
Thread.Sleep(2000);
timer.Dispose();
foreach (var item in list)
{
Console.WriteLine(item.ToString());
}
Console.ReadLine();
}
private static void Callback(object state)
{
List<int> l = (List<int>)state;
id++;
l.Add(id);
}
}
}
System.Timers.Timer
以默认构造函数来介绍:
public Timer();
主要成员有:
- Elapsed 定期执行的事件
- Interval 触发Elapsed事件的时间间隔
- AutoReset 执行一次还是重复执行
- Start 开始计时
- Stop 停止计时
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Test;
using System.Timers;
using System.Threading;
namespace ConsoleApp4
{
class Program
{
private static int id;
private static List<int> list;
static void Main(string[] args)
{
list = new List<int>();
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 100;
timer.AutoReset = true;
timer.Elapsed += Timer_Elapsed;
timer.Start();
Thread.Sleep(2000);
timer.Stop();
foreach (var item in list)
{
Console.WriteLine(item.ToString());
}
Console.ReadLine();
}
private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
id++;
list.Add(id);
}
}
}
System.Windows.Forms.Timer
以默认构造函数来介绍:
public Timer();
主要成员有:
- Tick 定期触发的事件;
- Interval 触发Tick事件的时间间隔
- Start 开始计时
- Stop 停止计时
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private int id;
public Form1()
{
InitializeComponent();
Timer timer = new Timer();
timer.Tick += Timer_Tick;
timer.Interval = 500;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
if (id >= 5)
{
Timer t = (Timer)sender;
t.Stop();
return;
}
id++;
MessageBox.Show(id.ToString());
}
}
}
System.Windows.Threading.DispatcherTimer
和System.Windows.Forms.Timer类似,就不多介绍了。
高精度定时器(多媒体定时器Mmtimer)
使用过程中我们会发现,以上谈到的定时器在时间间隔比较小,比如5ms和10ms时,都不是非常准。那么有没有高精度的定时器呢。有,多媒体定时器。
以默认构造函数来介绍:
public MmTimer()
主要成员有:
- Tick 定期触发的事件;
- Interval 触发Tick事件的时间间隔
- Start 开始计时
- Stop 停止计时
因为MS在C#里没有提供现成的库(C++中有),所以有人做了包装。