C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# timer与线程使用

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

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

您可能感兴趣的文章:
阅读全文