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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C#中三种Timer计时器的详细用法

    一.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 首先注意一点就是:Windows 计时器是为单线程环境设计的.它直接继承自Componet. Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器. Timer控件和它所在的Form属于同一个线程,在这种Timer的EventHandler中可以直接获取和修改

  • C#中的三种定时计时器Timer用法介绍

    在.NET中有三种计时器: 1.System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet.Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器.Timer控件和它所在的Form属于同一个线程: 2.System.Timers命名空间下的Timer类.System.Timers.Timer类:定义一个System.T

  • C#四种计时器Timer的区别和用法

    1.System.Threading.Timer 线程计时器 1.最底层.轻量级的计时器.基于线程池实现的,工作在辅助线程. 2.它并不是内在线程安全的,并且使用起来比其他计时器更麻烦.此计时器通常不适合 Windows 窗体环境. 构造函数:public Timer(TimerCallback callback, object state, int dueTime, int period); string state="."; //state参数可以传入想在callback委托中处理

  • C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

    本文实例讲述了C#中Forms.Timer.Timers.Timer.Threading.Timer的用法分析,分享给大家供大家参考.具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③ System.Threading.Timer 现分述如下: 一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用

  • 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 {     // 摘要:    实现按用户定

  • C#在新建线程中使用Timer无效问题及解决

    目录 在新建线程中使用Timer无效 第一步 第二步 C# Timer无法停止的解决 问题果然解决了 在新建线程中使用Timer无效 在C#winform窗体设计中,我们像重复运行某一功能时,我们想到的就是使用C#的Timer控件,但如果这个功能执行一次需要较长时间时,就会占用UI线程,从而会出现窗体上的控件无法选中或点击.这个问题可以通过多线程来解决,但在多线程中,会出现timer控件无效的问题. 首先,我们在窗体设计页面上选择的timer控件,是属于System.Windows.Forms.

  • 深入了解Java定时器中的Timer的原理

    目录 主要成员变量 定时功能 TimerThread 结论 Demo代码位置 Java在1.3版本引入了Timer工具类,它是一个古老的定时器,搭配TimerTask和TaskQueue一起使用.从Java5开始在并发包中引入了另一个定时器ScheduledThreadPoolExecutor,它对Timer做了很多改进并提供了更多的工具,可以认为是对Timer的取代. 那为什么还要介绍Timer工具类呢?通过了解Timer的功能和它背后的原理,有助于我们更好的对比了解ScheduledThre

  • Java中定时器Timer致命缺点案例详解

    目录 简介 案例1:定时器打印Hello World! 线程不死问题? 案例2:单线程问题 定时器实际应用场景 学习方法心得 总结 简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人没有问题,特别是正在看我博文的小伙伴那更不用说了!!给你们点个狂力赞.接下来就是学习方法了,我发现近期来咨询我问题的小伙伴学习姿势不对,所以我用Java中定时器Time

  • Python中threading.Timer()定时器实现定时任务

    目录 1.单线程执行 2.多线程执行 timer最基本理解就是定时器,可以启动多个定时任务,这些定时器任务是异步执行,所以不存在等待顺序执行问题. Timer方法 说明 Timer(interval, function, args=None, kwargs=None) 创建定时器 cancel() 取消定时器 start() 使用线程方式执行 join(self, timeout=None) 等待线程执行结束 1.单线程执行 示例代码: from datetime import datetime

  • VBA中的Timer函数用法

    第1.40例 Timer 函数 一.题目: 要求编写一段代码,运用 Timer 函数来计算本代码运行所化的时间. 二.代码: Sub 示例_1_040() Dim t, i&, a t = Timer For i = 1 To 1000000 a = a + i Next i MsgBox Timer - t & "秒" '返回0.046875秒 End Sub 三.代码详解 1.Sub 示例_1_040():宏程序的开始语句.宏名为示例_1_040. 2.Dim t,

  • go语言中使用timer的常用方式

    本文实例总结了go语言中使用timer的常用方式.分享给大家供大家参考.具体分析如下: 下面三段代码(A,b,C)的功能都是在5分钟后执行指定的函数的go语言代码: 复制代码 代码如下: // (A) time.AfterFunc(5 * time.Minute, func() {     fmt.Printf("expired") } // (B) create a Timer object timer := time.NewTimer(5 * time.Minute) <-t

  • C#线程处理系列之线程池中的I/O线程

    一.I/O线程实现对文件的异步  1.1  I/O线程介绍: 对于线程所执行的任务来说,可以把线程分为两种类型:工作者线程和I/O线程. 工作者线程用来完成一些计算的任务,在任务执行的过程中,需要CPU不间断地处理,所以,在工作者线程的执行过程中,CPU和线程的资源是充分利用的. I/O线程主要用来完成输入和输出的工作的,在这种情况下, 计算机需要I/O设备完成输入和输出的任务,在处理过程中,CPU是不需要参与处理过程的,此时正在运行的线程将处于等待状态,只有等任务完成后才会有事可做, 这样就造

  • Android 中三种启用线程的方法总结

    在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应. 而Runnable是一个接口,Thread是Runnable的子类.所以说,他俩都算一个进程. HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环

随机推荐