C#中的timer与线程使用
作者:qgbooooo
这篇文章主要介绍了C#中的timer与线程使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
C#的timer与线程使用
卡顿怎么处理,多线程。多线程比timer好读。看看timer和线程的关系。
timer有3种
1.winform 下的timer。就是拖控件到UI上的那个timer.
源文件在这个路径下C:\Windows\Microsoft.NET\Framework64\v4.0.30319
namespace System.Windows.Forms { // 摘要: 实现按用户定义的时间间隔引发事件的计时器。 此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中 使用。 [DefaultEvent("Tick")] [DefaultProperty("Interval")][SRDescriptionAttribute("DescriptionTimer")][ToolboxItemFilter("System.Windows.Forms")] public class Timer : Component }
启动timer代码如下:
[SRCategory("CatBehavior")] [DefaultValue(false)] [SRDescription("TimerEnabledDescr")] public virtual bool Enabled { get { if (this.timerWindow == null) { return this.enabled; } return this.timerWindow.IsTimerRunning; } set { lock (this.syncObj) { if (this.enabled != value) { this.enabled = value; if (!base.DesignMode) { if (value) { if (this.timerWindow == null) { this.timerWindow = new TimerNativeWindow(this); } this.timerRoot = GCHandle.Alloc(this); this.timerWindow.StartTimer(this.interval); } else { if (this.timerWindow != null) { this.timerWindow.StopTimer(); } if (this.timerRoot.IsAllocated) { this.timerRoot.Free(); } } } } } } }
最终调用了this.timerWindow.StartTimer(this.interval); 源码如下。
可见,最终调用的是系统的timer?系统是有定时器的。Ucos上,就有32个定时器,当然也可以开线程。
他们是不同的概念。windows 也差不多吧。这些定时器应该与CPU有关。
public void StartTimer(int interval) { if (this._timerID == 0 && !this._stoppingTimer && this.EnsureHandle()) { this._timerID = (int)SafeNativeMethods.SetTimer(new HandleRef(this, base.Handle), TimerNativeWindow.TimerID++, interval, IntPtr.Zero); } }
2. public sealed class Timer : MarshalByRefObject, IDisposable System.Threading.Timer
public Timer(TimerCallback callback) { int dueTime = -1; int period = -1; StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMyCaller; this.TimerSetup(callback, this, (uint)dueTime, (uint)period, ref stackCrawlMark); } [SecurityCritical] private void TimerSetup(TimerCallback callback, object state, uint dueTime, uint period, ref StackCrawlMark stackMark) { if (callback == null) { throw new ArgumentNullException("TimerCallback"); } this.m_timer = new TimerHolder(new TimerQueueTimer(callback, state, dueTime, period, ref stackMark)); } [SecurityCritical] internal static void Pause() { TimerQueue.Instance.Pause(); } [SecurityCritical] internal static void Resume() { TimerQueue.Instance.Resume(); }
这里是TimerQueue 队列的操作。既然在Threading 命名空间下,可能与线程有关。他在的dll 是 mscorlib.
3. System.Timers.Timer, 在system.dll中。 只是对 System.Threading.Timer的封装。
[TimersDescription("TimerEnabled")] [DefaultValue(false)] public bool Enabled { get { return this.enabled; } set { if (base.DesignMode) { this.delayedEnable = value; this.enabled = value; } else if (this.initializing) { this.delayedEnable = value; } else if (this.enabled != value) { if (!value) { if (this.timer != null) { this.cookie = null; this.timer.Dispose(); this.timer = null; } this.enabled = value; } else { this.enabled = value; if (this.timer == null) { if (this.disposed) { throw new ObjectDisposedException(base.GetType().Name); } int num = (int)Math.Ceiling(this.interval); this.cookie = new object(); this.timer = new System.Threading.Timer(this.callback, this.cookie, num, this.autoReset ? num : (-1)); } else { this.UpdateTimer(); } } } } }
4.使用:
void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 if (timer != null) { timer.Stop(); timer.Close(); timer = null; } int Interval = 3600000;//6 hours timer = new System.Timers.Timer(Interval);//十分钟 timer.Elapsed += SendSMS.Send_ticker; timer.Interval = Interval; timer.Enabled = true; timer.Start(); }
C#新线程延时
开启一个新线程
在这个线程中,进行任务排队。
任务1完成后,等待延时200ms,再运行任务2
private void Timer1_Tick(object sender, EventArgs e) { //throw new NotImplementedException(); Task.Run(() => { this.Invoke( new Action( () => { listBox1.Items.Add("进中断"+DateTime.Now.ToString() + "\r\n"); })); //RS485.Set_io(7);//ok //RS485.Rest_io(7);//ok if (i > 8) i = 0; RS485.Set_io(i++);//ok this.Invoke(new Action(() => { listBox1.Items.Add("第1次输出" + DateTime.Now.ToString() + "\r\n"); })); Thread.Sleep(200); RS485.Rest_io((ushort)(i - 2));//ok this.Invoke(new Action(() => { listBox1.Items.Add("第2次输出" + DateTime.Now.ToString() + "\r\n"); })); Thread.Sleep(200); //RS485.Read_io_out(0,8);//ok RS485.Read_io_in(0, 8);//ok this.Invoke(new Action(() => { listBox1.Items.Add("第3次输出" + DateTime.Now.ToString() + "\r\n"); })); //RS485.Read_io_Reg(0,4);// //RS485.Read_io_Regs(0, 6);// Thread.Sleep(200); }); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。