创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
成都创新互联公司主营晋州网站建设的网络公司,主营网站建设方案,重庆APP软件开发,晋州h5成都微信小程序搭建,晋州网站营销推广欢迎晋州等地区企业咨询小编这次要给大家分享的是浅谈c#中几种定时器,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。
1、前言不知道你是否对.NET里面的定时器产生过一些疑问,以下是武小栈个人的一些总结。
2、官方介绍在.NET的框架之内定时器有四种,先看一下微软官方对他们各自特点介绍:
再看看微软对开发者的使用建议:
System.Threading.Timer 是一种简单的轻型计时器,它使用回调方法,并由线程池线程提供服务。 不建议与 Windows 窗体一起使用,因为它的回调不会在用户界面线程上发生。 System.Windows.Forms.Timer 是用于 Windows 窗体的更好选择。 对于基于服务器的计时器功能,您可以考虑使用 System.Timers.Timer,这会引发事件并具有其他功能。
3、个人体会是一个基础类,使用起来不是太好用,各种用法较为原始,用的较少。
System.Windows.Forms.Timer Class第一次接触的就是它,毕竟直接winform拖下来就行了,用的还是比较多,我通常用在运行一些刷新界面的代码,这些代码通常不会有什么逻辑运算,比如界面上需要显示一个倒计时。
在这个类使用中我遇到过两个疑惑,作为分享:
Q1:Tick实践会创建新线程执行吗?
A1:不会创建新的线程,始终在主线程里面运行Tick事件;
Q2:定时器会start()瞬间触发一次,还是等待Interval间隔后再触发?
A2:等待Interval间隔后再触发。
Q3:定时器start()和stop()时候Interval会累积吗?
A3:不累积,每次start()重新计时。
Q4:如果Tick事件内的代码未执行完成,但是下一次Tick定时已经达到会发生什么?
A4:不会强行终止未完成的代码,也不会因为上一次Tick事件代码未执行完成而不再触发,而是类似于栈的形式将之前未执行完成的代码堆积,后触发的Tick事件内的代码先执行,先触发未完成的代码后执行,具体可以看下面示例。
public Form1() { InitializeComponent(); timerForm.Tick += TimerForm_Tick; } private int num = 1;//一个序号,表示当前第几次进入Tick事件 private int rowNum = 1;//一个全局的行号,记录一下总共AppendText多少次 private void TimerForm_Tick(object sender, EventArgs e) { string s = $"我是第{num++}次"; for (int i = 0; i < 5; i++) { textBox1.AppendText($"{rowNum++} {s} 序号i={i} 当前线程ID={Thread.CurrentThread.ManagedThreadId.ToString()} \r\n"); Delay(1000); } } private Timer timerForm = new Timer(){Interval = 1000}; private void button1_Click(object sender, EventArgs e) { textBox1.AppendText("button " + Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n"); timerForm.Start(); } public static void Delay(int mimillisecond) { int start = Environment.TickCount; while (Math.Abs(Environment.TickCount - start) < mimillisecond) { System.Windows.Forms.Application.DoEvents(); } }