C# Timer(3种)

用到的地方
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
http://img2.58codes.com/2024/20106764CbJxYOozCa.png

在load时启动timer

        private void Timer1_Load(object sender, EventArgs e)        {            timer2.Start();        }

撰写tick 事件
http://img2.58codes.com/2024/20106764WH4xISnkMV.png

        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输入
http://img2.58codes.com/2024/20106764PECKD7Hx7O.png

        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();


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章