Timer组件 Timer计时器 间隔时间 —每隔这个间隔时间就会引发事件
いち System.Windows.Forms.Timer
Windows应用程序 独占一个线程 可以修改UI元素,基于UI的
属性 interval 时间间隔 ms 1000ms=1s
事件 tick
应用:动态时间显示
如果是Windows应用程序,要使用计时器功能System.Windows.Forms.Timer 是首选。
//每隔指定的时间间隔就会触发
private void timer1_Tick(object sender, EventArgs e)
{
lblDateTime.Text = DateTime.Now.ToString();
}
private void FrmTimer_Load(object sender, EventArgs e)
{
lblDateTime.Text = DateTime.Now.ToString();
timer1.Enabled = true; //启动计时器
}
如果单次执行时间超过间隔时间,会影响下次触发。精度很差。
····························································································
に System.Timers.Timer
基于服务 计时器 轻量
时间间隔 触发 Elapsed事件 —执行操作 ----不是由UI线程执行的
属性
Interval 时间间隔
AutoReset false引发一次就停止 true默认
不可以直接修改UI元素,
可以通过UI元素的invoke()完成,委托里修改UI元素----修改UI元素
private void FrmTimer_Load(object sender, EventArgs e)
{
System.Timers.Timer timer3 = new System.Timers.Timer();
timer3.Interval = 1000;
//timer3.AutoReset = false; //只会引发一次,就停止了
timer3.Elapsed += Timer3_Elapsed; //事件
timer3.Start(); //开启计时器
}
int count = 0; //触发次数的终点
private void Timer3_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//不能直接修改UI元素的内容
//lblDt2.Text= DateTime.Now.ToString();
count += 1;
//用委托来进行修改元素内容
Action act = UpdateTime;
this.Invoke(act);
if(count >10)
{
System.Timers.Timer timer = (System.Timers.Timer)sender;
timer.Stop(); //停止计时器
}
}
//委托方法
private void UpdateTime()
{
lblDatatime.Text = DateTime.Now.ToString();
}
耗时操作,不会使UI失去响应 不会影响下一次的触发
さん System.Threading.Timer
多线程 计时器 轻量级 精度高
提供以指定的时间间隔对线程池线程执行方法的机制。
单次运行过长,并不会影响下次的触发, 回调方法执行操作
//System.Threading.Timer timer4;
private void FrmTimer_Load(object sender, EventArgs e)
{
//多线程
//period 时间间隔 0或-1 只会执行一 次,然后就停止
//Change 可以让计时器重新启动
//停止 ①period 0 -1 ②timer4.Dispose()
int count2 = 0;
timer4 = new System.Threading.Timer(new System.Threading.TimerCallback(o => {
count2 += 2;
Action<int> act = ShowCount;
this.Invoke(act, count2);
}), null, 1000,1000);
//参数 回调函数,执行对象,延迟启动时间,触发时间间隔
//timer4.Change(2000, 2000); //改变延迟启动时间和时间间隔
}
//委托函数
private void ShowCount(int cout)
{
txtCount.Text = cout.ToString();
if (cout > 50)
timer4.Dispose();
}
不可以直接修改UI元素,也不是由UI线程上运行,UI元素的invoke()来实现