C#中的timer与线程使用

C#中的timer与线程使用

目录

C#的timer与线程使用

timer有3种

C#新线程延时

开启一个新线程

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持易知道(ezd.cc)。 

推荐阅读

    设置线程名称|tomcat线程名称设置

    设置线程名称|tomcat线程名称设置,,1. tomcat线程名称设置一.tomcat的优化1.tomcat的自身调优采用动静分离调优Tomcat线程池调优Tomcat的

    多线程cpu电脑|多线程的CPU

    多线程cpu电脑|多线程的CPU,,1. 多线程的CPU四核心四线程,表示这个电脑的CPU核心是4个核心、4个线程的。电脑CPU的核心数量和线程数量越多,

    简单的线程池(三)

    简单的线程池(三),吞吐量,线程,◆ 概要本文中,作者针对 《简单的线程池(一)》 和 《简单的线程池(二)》 介绍的两个线程池分别进行了并发测试。基

    foreach的用法c语言和c#

    foreach的用法c语言和c#,数组,遍历,本文目录foreach的用法c语言和c#详细讲解foreach循环的用法C#中的foreach 怎么用啊foreach用法C#中的f

    Common Lisp支持多线程吗

    Common Lisp支持多线程吗,语言,都是,本文目录Common Lisp支持多线程吗能推荐下比较经典的common lisp 代码么相比Scheme 与 Common Lisp,Cl