用到的地方
1.每秒更新时间
2.每15分提醒眼睛需要休息
3.提醒:下班时间到了
4.更新UI上的时钟
同一执行绪 VS.不同执行绪
System.Windows.Forms.Timer 存取UI元件 (同一执行绪)
System.Timers.Timer
-存取UI元件 用SynchronizingObject属性 (设为同一执行绪)
-存取UI元件 访问 (不同执行绪)
System.Threading.Timer(透由委派来存取UI元件)
时间单位为毫秒(ms) 1000是一秒
System.Windows.Forms.Timer
只要把工具箱中的Timer控制项拖到表单上,然后设置事件和间隔时间等属性就可以了
Start 方法启用定时器,开始触发 Elapsed
Stop 方法停止定时器,停止触发 Elapsed
拉timer
在load时启动timer
private void Timer1_Load(object sender, EventArgs e) { timer2.Start(); }
撰写tick 事件
private void timer2_Tick(object sender, EventArgs e) { //在这里做想做的事 label1.Text = (int.Parse(label1.Text) + 1).ToString(); }
System.Timers.Timer
Start 方法启用定时器,开始触发 Elapsed
Stop 方法停止定时器,停止触发 Elapsed
private System.Timers.Timer _TimersTimer; private void Timer2_Load(object sender, EventArgs e) { this._TimersTimer = new System.Timers.Timer(); this._TimersTimer.Interval = 100; this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed); this._TimersTimer.Start(); } void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { //在这里做想做的事 }
存取UI
出现错误讯息 : 跨执行绪作业无效: 存取控制项 'label1' 时所使用的执行绪与建立控制项的执行绪不同。
解决方法
SynchronizingObject
拉一个label做显示
private System.Timers.Timer _TimersTimer; private void Timer2_Load(object sender, EventArgs e) { this._TimersTimer = new System.Timers.Timer(); this._TimersTimer.Interval = 100; this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed); this._TimersTimer.SynchronizingObject = this; this._TimersTimer.Start(); } void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { //在这里做想做的事 label1.Text = (int.Parse(label1.Text) + 1).ToString(); }
委派
private System.Timers.Timer _TimersTimer; private void Timer22_f_Load(object sender, EventArgs e) { this._TimersTimer = new System.Timers.Timer(); this._TimersTimer.Interval = 100; this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed); this._TimersTimer.Start(); } private void Timer22_f_FormClosed(object sender, FormClosedEventArgs e) { _TimersTimer.Stop();//如果不停的话,timer会继续跑而且找不到label就会出错 } delegate void UpdateControl1( string Msg); private object _objLock1 = new object(); void _mUpdateControl( string Msg) { lock (this._objLock1) { label1.Text = Msg; } } void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { int iVal = (int.Parse(label1.Text) + 1); this.BeginInvoke( new UpdateControl1(_mUpdateControl)//fuction , new object[] { iVal }//param ); }
System.Threading.Timer
不断更新时间
不断更新时间的同时,也能在textbox输入
using System.Threading; private void button9_Click(object sender, EventArgs e) { //宣告timer要做什么事.要做什么事呢?要做_do的事 TimerCallback callback = new TimerCallback(_do); //1.function 2.开关 3.等多久再开始 4.隔多久反覆执行 System.Threading.Timer timer = new System.Threading.Timer(callback,null,0,1000); } private void _do(object state) { int count=0; while(count<100) { Console.WriteLine(count); } }
存取UI
private void button9_Click(object sender, EventArgs e) { //宣告timer要做什么事.要做什么事呢?要做_do的事 TimerCallback callback = new TimerCallback(_do); //1.function 2.开关 3.等多久再开始 4.隔多久反覆执行 System.Threading.Timer timer = new System.Threading.Timer(callback,null,0,1000); } private void _do(object state) { this.BeginInvoke(new setLable2(setLabel2)); //label2.Text = DateTime.Now.ToString(); //Console.WriteLine(DateTime.Now.ToString()); } delegate void setLable2(); private void setLabel2() { label2.Text = DateTime.Now.ToString(); }
Q
它有点像接力赛,跑一跑,交棒换别人,然后再等着棒子回来再继续做.
AutoResetEvent AutoResetEvent = new AutoResetEvent(false);//它是开关,开始/停(换人)/结束
?autoEvent.Set();//交棒出去//?没有交棒出去,UI上也能输入.所以交棒的用意在哪里呢?
AutoResetEvent.WaitOne();